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

时间:2018-07-21 10:16:39

标签: python

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循环中访问的元素会修改原始变量?

1 个答案:

答案 0 :(得分:3)

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

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

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