gpt4 book ai didi

python - 为什么 Python 的 'for ... in' 在值列表和字典列表上的工作方式不同?

转载 作者:太空狗 更新时间:2023-10-29 22:00:21 25 4
gpt4 key购买 nike

我想知道关于 for ... in 在 Python 中如何工作的一些细节。

我的理解是 for var in iterable 在每次迭代时创建一个变量 var,绑定(bind)到 iterable 的当前值。所以,如果你在 cows 中为 c 做 ; c = cows[whatever],但在循环内更改 c 不会影响原始值。但是,如果您将值分配给字典键,它的工作方式似乎会有所不同。

cows=[0,1,2,3,4,5]
for c in cows:
c+=2

#cows is now the same - [0,1,2,3,4,5]

cows=[{'cow':0},{'cow':1},{'cow':2},{'cow':3},{'cow':4},{'cow':5}]
for c in cows:
c['cow']+=2

# cows is now [{'cow': 2}, {'cow': 3}, {'cow': 4}, {'cow': 5}, {'cow': 6}, {'cow': 7}
#so, it's changed the original, unlike the previous example

我看到有人也可以使用 enumerate 使第一个示例工作,但我想那是另一回事。

cows=[0,1,2,3,4,5]
for i,c in enumerate(cows):
cows[i]+=1

# cows is now [1, 2, 3, 4, 5, 6]

为什么它会影响第二个示例中的原始列表值而不是第一个?

[编辑]

感谢您的回答。我从 PHP 的角度来看这个问题,您可以在 foreach 中使用 & 符号来指定您是在对可迭代对象的引用还是副本进行操作。我现在看到真正的区别在于 python 如何处理不可变对象(immutable对象)的基本细节。

最佳答案

它有助于描绘每次迭代中 c 持有的引用发生了什么:

[ 0, 1, 2, 3, 4, 5 ]
^
|
c

c 持有指向列表中第一个元素的引用。当您执行 c += 2(即 c = c + 2)时,临时变量 c 会重新分配一个新值。这个新值是 2c 被反弹到这个新值。原始列表保持不变。

[ 0, 1, 2, 3, 4, 5 ]

c -> 2

现在,在字典的情况下,这是 c 在第一次迭代期间绑定(bind)到的内容:

[ {'cow':0}, {'cow':1}, {'cow':2}, {'cow':3}, {'cow':4}, {'cow':5} ]
^
|
c

这里,c 指向字典对象{'cow':0}。当您执行 c['cow'] += 2(即 c['cow'] = c['cow'] + 2)时,字典对象本身已更改,因为 c 不会重新绑定(bind)到不相关的对象。也就是说,c 仍然指向第一个字典对象。

[ {'cow':2}, {'cow':1}, {'cow':2}, {'cow':3}, {'cow':4}, {'cow':5} ]
^
|
c

关于python - 为什么 Python 的 'for ... in' 在值列表和字典列表上的工作方式不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2926580/

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