Я обычно использую sys.platform
для получения платформы. sys.platform
будет различать Linux, другой unixes и OS X, в то время как os.name
" posix
" для всех них.
Для большой более подробной информации, используйте модуль платформы . Это имеет межплатформенные функции, которые дадут Вам информацию об архитектуре машины, версии ОС и версии ОС, версии Python, И т.д. Также это имеет определенные для OS функции для получения вещей как конкретный дистрибутив Linux.
Технически лямбда-выражение закрыто над i
, видимым в глобальной области, которая в последний раз установлена на 9. Это ] same i
упоминается во всех 10 лямбдах. Например,
i = 13
print b[3]()
В функции makeFun
лямбда закрывается для i
, который определяется при вызове функции. Это десять разных и
сек.
Один набор функций (a) работает с переданным аргументом, а другой (b) работает с глобальной переменной, которая затем устанавливается в 9. Проверьте разборку:
>>> import dis
>>> dis.dis(a[2])
1 0 LOAD_DEREF 0 (i)
3 RETURN_VALUE
>>> dis.dis(b[2])
1 0 LOAD_GLOBAL 0 (i)
3 RETURN_VALUE
>>>
Лямбды в Python разделяют область видимости переменных, в которой они созданы. В вашем первом случае область действия лямбда - это makeFun. Во втором случае это глобальный i
, который равен 9, потому что это остаток цикла.
В любом случае это то, что я понимаю ...
Хороший улов. Лямбда в понимании списка каждый раз видит одно и то же local i
.
Вы можете переписать это как:
a = []
for i in range(10):
a.append(makefun(i))
b = []
for i in range(10):
b.append(lambda: i)
с тем же результатом.
Как утверждали другие, проблема в области видимости. Обратите внимание, что вы можете решить эту проблему, добавив дополнительный аргумент к лямбда-выражению и присвоив ему значение по умолчанию:
>> def makeFun(i): return lambda: i
...
>>> a = [makeFun(i) for i in range(10)]
>>> b = [lambda: i for i in range(10)]
>>> c = [lambda i=i: i for i in range(10)] # <-- Observe the use of i=i
>>> a[2](), b[2](), c[2]()
(2, 9, 2)
В результате i
теперь явно помещается в область, ограниченную лямбда-выражением
выражение.