在python中的for循环中,列表元素何时被修改的困惑


import numpy as np
a = np.array([1])
b = np.array([2])
for i in [a,b]:
i+=1
print(a)
print(b)

这会生成输出

[2]
[3]

但是

a = 1
b = 2
for i in [a,b]:
i+=1
print(a)
print(b)

这会生成输出

1
2

为什么存在这种行为差异?在哪种情况下,我可以假设在for循环中访问的元素会修改原始变量?

在第一个代码中,ab分别是一维单条目numpy数组的名称。当您在for语句中构建列表[a, b]时,该列表包含这些数组,因此循环中的i将成为一个数组。关键是下一步:当执行i+=1行时,Python将1添加到数组中。Numpy截取这个命令,并使用一个通用函数(也称为ufunc(将1添加到数组的每个成员中。因此,每个数组都发生了变化。但是,ab仍然是这些数组的名称,因此ab都发生了更改,您可以得到结果。

在第二个代码中,ab分别是一个数字常量的名称。当列表生成时,它包含这些常量。当执行行i+=1时,1被添加到常量中,但由于常量是不可变的,结果被丢弃。因此CCD_ 17和CCD_。

所以简单的答案是:第一个代码使用列表中的可变值,而第二个代码使用了列表中的不可变值。这些在Python中的行为不同。

最新更新