- 主题:大佬解释下这段代码的输出?
def create_multipliers():
return [lambda x : i * x for i in range(5)]
print(create_multipliers())
for multiplier in create_multipliers():
print(multiplier(2))
为何是
8
8
8
8
8
而不是
0
2
4
6
8
谢谢
--
FROM 120.242.251.*
def create_multipliers():
return [lambda x,i=i: i * x for i in range(5)]
print(create_multipliers())
for multiplier in create_multipliers():
print(multiplier(2))
--
FROM 118.74.47.*
就是这代码看不懂,能解释下吗?
【 在 upupdad 的大作中提到: 】
: def create_multipliers():
: return [lambda x,i=i: i * x for i in range(5)]
:
: ...................
--
FROM 120.242.251.*
你原来代码lambda里的i不是循环的i的值,而是create_multipliers的变量i传入
create_multipliers运行return前,i值变为了4
【 在 feng321 的大作中提到: 】
: 就是这代码看不懂,能解释下吗?
--
FROM 116.23.162.*
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.*
0
2
4
6
8
这个结果符合预期
【 在 stockbsd 的大作中提到: 】
: for fs in (lambda x: i*x for i in range(5)):
: print(fs(2))
: 会输出多少呢?
: ...................
--
FROM 120.242.251.*
def create_multipliers():
return list(map(lambda i: lambda x: i*x, range(5)))
print(create_multipliers())
for multiplier in create_multipliers():
print(multiplier(2))
这个的结果是
0
2
4
6
8
【 在 ToSimplicity 的大作中提到: 】
: 1. i是个变量
: 2. i对于lambda来说不是local变量, 它的namespace在create_multipliers()下, 同一次create_multipliers()下的lambda使用的i都是同一个对象
: 可以试试下行里变量的namespace都在哪
: ...................
--
FROM 120.242.251.*
这些不是根本。 原因是函数中变量绑定是运行时决定的,不是函数定义时决定。
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.*