gpt4 book ai didi

python - 什么时候在 Python 中引入新名称?

转载 作者:太空宇宙 更新时间:2023-11-03 14:28:03 24 4
gpt4 key购买 nike

我问是因为有人创建了一个 lambda 列表的经典问题:

foo = []
for i in range(3):
foo.append((lambda: i))

for l in foo:
print(l())

并且出乎意料地只得到了 twos 作为输出。通常提出的解决方案是使 i 成为这样的命名参数:

foo = []
for i in range(3):
foo.append((lambda i=i: i))

for l in foo:
print(l())

这会产生所需的输出 0, 1, 2 但现在发生了一些神奇的事情。它有点像预期的那样,因为 Python 是按引用传递的,而您不需要引用。

不过,只是为某物添加一个新名称,不应该只是创建另一个引用吗?

所以问题变成了当某物不是引用时的确切规则是什么?

考虑到 int 是不可变的并且以下工作:

x = 3
y = x
x = 5
print(x, y) // outputs 5 3

可能解释了为什么添加该命名参数有效。创建并捕获了具有相同值的本地 i

现在,为什么我们的 lambda 引用了相同的 i?我将一个 int 传递给函数,它被引用,如果我将它存储在一个变量中,它就会被复制。嗯。

基本上,我正在寻找最简洁和抽象的方式来准确记住它是如何工作的。什么时候引用相同的值,我什么时候得到一个副本。如果它有任何通用名称并且存在相同的编程语言,那也会很有趣。

这是我目前的假设:

  1. 参数总是通过引用传递给函数。
  2. 分配给不可变类型的变量会创建一个副本。

无论如何我都会问,只是为了确定并希望获得一些背景知识。

最佳答案

这里的问题是您如何看待名称。

在您的第一个示例中,i 是每次循环迭代时分配给的变量。当您使用 lambda 创建一个函数时,您创建了一个访问名称 i 并返回其值的函数。这意味着随着名称 i 的变化,函数返回的值也会发生变化。

默认参数技巧起作用的原因是在定义函数时评估名称。这意味着默认值是当时 i 名称指向的,而不是名称本身。

i 是一个标签。 012 是对象。在第一种情况下,程序将 0 分配给 i,然后创建一个返回 i 的函数 - 然后它用 1 执行此操作2。当函数被调用时,它会查找 i(现在是 2)然后返回它。

在第二个示例中,您将0 分配给i,然后创建一个带有默认参数的函数。该默认参数是通过评估 i 获得的值 - 即对象 0。这对 12 重复。当函数被调用时,它会将默认值分配给一个新变量 i,该变量是函数的局部变量,与外部 i 无关。

关于python - 什么时候在 Python 中引入新名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16906444/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com