您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

闭包如何实现?

闭包如何实现?

我认为当您将其i视为一个 名称 而不是某种 价值 时,会发生什么很明显。你的lambda函数确实像“拍X:查找我的价值,我计算** X” ......所以,当你实际运行的功能,查找i 只是那么 这样i4

您也可以使用当前数字,但必须让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]=5mylist[1]=5mylist[2]=5-难怪他们不要当你重新分配的变化i。如果i是可变的东西,例如一个列表,那么更改i也将反映在所有条目中myList,因为对于同一个 您只是拥有 不同的名称

您可以mylist[0]=证明的左手使用的简单事实证明它确实是一个名称。我喜欢叫=指定名称操作 :它需要一个名字上的左边,右边一个表达式,然后计算表达式(通话功能,查找值名称后面),直到它有一个值,最后给出了名字价值。它不会 。

其他 2022/1/1 18:28:33 有545人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶