为什么以下代码会增加每个数字:
numbers = [1, 2, 3]
for number in numbers:
numbers[numbers.index(number)] += 100
print(numbers) # prints [101, 201, 301]
但这不会?:
numbers = [1, 2, 3]
for number in numbers:
number += 100
print(numbers) # prints [1, 2, 3]
更令人困惑的是,我们似乎在两种情况下都在处理相同的对象:
numbers = [1, 2, 3]
for number in numbers:
print(numbers[numbers.index(number)] is number) # prints True
我知道这与分配与改变值和/或内存分配有“某种关系”,但我无法确定到底发生了什么。
numbers[x]
只是numbers.__getitem__(x)
(用作右值时)或numbers.__setitem__(x, y)
(用作左值时)的不同语法。
所以在你的第一个例子中,__setitem__()
调用了数字列表的方法来更新列表。在引擎盖下,您的代码大致转换为如下所示:
for number in numbers:
index = numbers.index(number)
new_value = numbers.__getitem__(index) + 100
numbers.__setitem__(index, new_value)
请注意,上面的代码是有效的 Python,并且与原始循环具有相同的效果。
在您的第二个示例中,从列表中检索值并将其存储在局部变量中number
,然后您将覆盖该变量。这对原始列表没有影响。
注意:另请注意,使用比较整数is
可能会导致意外行为。有关更多详细信息,请参见例如这篇 SO 帖子。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句