我认为当您将其i
视为一个 名称 而不是某种 价值 时,会发生什么很明显。你的lambda函数确实像“拍X:查找我的价值,我计算** X” ......所以,当你实际运行的功能,查找i
只是那么 这样i
的4
。
您也可以使用当前数字,但必须让Python将其绑定到另一个名称:
def makeActions():
def make_lambda( j ):
return lambda x: j * x # the j here is still a name, but Now it wont change anymore
acts = []
for i in range(5):
# Now you're pushing the current i as a value to another scope and
# bind it there, under a new name
acts.append(make_lambda(i))
return acts
这似乎令人困惑,因为您经常被告知变量和变量的值是同一回事–的确如此,但仅在实际使用变量的语言中。Python没有变量,但是有名称。
关于您的评论,实际上我可以更好地说明这一点:
i = 5
myList = [i, i, i]
i = 6
print(myList) # myList is still [5, 5, 5].
您说您 将i更改为6 ,但这并不是实际发生的情况:i=6
意思是“我有一个值,6
我想命名它i
”。您已经使用i
过名称的事实对Python而言无关紧要,它只会重新分配名称 ,而不 更改其值 (仅适用于变量)。
您可以说,在中myList = [i, i, i]
,无论i
当前指向的值(数字5)是什么,它都会得到三个新名称:mylist[0], mylist[1], mylist[2]
。这与调用函数时发生的事情相同:参数被赋予新名称。但这可能违背了有关列表的任何直觉…
这可以在例如解释行为:您分配mylist[0]=5
,mylist[1]=5
,mylist[2]=5
-难怪他们不要当你重新分配的变化i
。如果i
是可变的东西,例如一个列表,那么更改i
也将反映在所有条目中myList
,因为对于同一个值 您只是拥有 不同的名称 !
您可以mylist[0]
在=
证明的左手使用的简单事实证明它确实是一个名称。我喜欢叫=
的 指定名称操作 :它需要一个名字上的左边,右边一个表达式,然后计算表达式(通话功能,查找值名称后面),直到它有一个值,最后给出了名字价值。它不会 。