- 主题:大佬解释下这段代码的输出?
for fs in (lambda x: i*x for i in range(5)):
print(fs(2))
会输出多少呢?
【 在 iMx 的大作中提到: 】
: 你原来代码lambda里的i不是循环的i的值,而是create_multipliers的变量i传入
: create_multipliers运行return前,i值变为了4
:
: ...................
--
FROM 120.229.48.*
根源在于 Python’s closures are late binding. This means that the values of variables used in closures are looked up at the time the inner function is called.
你把方括号[]改成(),从list改成generator 输出就变“正常”了。
【 在 feng321 的大作中提到: 】
: def create_multipliers():
: return [lambda x : i * x for i in range(5)]
: print(create_multipliers())
: ...................
--
FROM 120.229.48.*
这些不是根本。 原因是函数中变量绑定是运行时决定的,不是函数定义时决定。
In [70]: i = 1
In [71]: f = lambda x :i*x
In [72]: i = 5
In [73]: f(2)
Out[73]: 10
【 在 ToSimplicity 的大作中提到: 】
: 1. i是个变量
: 2. i对于lambda来说不是local变量, 它的namespace在create_multipliers()下, 同一次create_multipliers()下的lambda使用的i都是同一个对象
: 可以试试下行里变量的namespace都在哪
: ...................
--
FROM 120.229.48.*
def create_multipliers():
return (lambda x : i * x for i in range(5))
for multiplier in create_multipliers():
print(multiplier(2))
那怎么解释这段代码输出?
【 在 ToSimplicity 的大作中提到: 】
: 1. i是个变量
: 2. i对于lambda来说不是local变量, 它的namespace在create_multipliers()下, 同一次create_multipliers()下的lambda使用的i都是同一个对象
: 可以试试下行里变量的namespace都在哪
: ...................
--
FROM 120.229.48.*