for循环中的Python赋值(理论澄清)
我需要澄清这是怎么回事,真正的原因是什么:for循环中的Python赋值(理论澄清),python,variable-assignment,immutability,Python,Variable Assignment,Immutability,我需要澄清这是怎么回事,真正的原因是什么: array = [0, 1, 2] for element in array: element += 1 print array #CHANGES NOTHING double_array = [[0,1], [2,3]] for element in double_array: element[0] = "Changed!" print double_array #THIS WORKS for element in doubl
array = [0, 1, 2]
for element in array:
element += 1
print array #CHANGES NOTHING
double_array = [[0,1], [2,3]]
for element in double_array:
element[0] = "Changed!"
print double_array #THIS WORKS
for element in double_array:
element = ["Doesn't work!"]
print double_array #NOPE
我凭直觉理解这一点,但我不确定这背后的理论。我的感觉是,python中的变量名是一个空灵的东西,如果你在它后面直接加上“=”的话,它会立即崩溃。如果变量引用一个列表,可以在它后面使用“.append”,或者在它后面使用“[0]=”,它就像C中的一个引用,但是如果直接给它赋值,python会立即像“哦,你不再需要这个名称了?好吧,现在它只引用你分配给它的这个东西,其他什么都没有”
特别是,对于我的第一个例子,“整数是不可变的”,这在我看来似乎是错误的。在我的第三个例子中,列表似乎与整数一样不可变。对此的正确解释是什么?在Python中,每个变量、数组元素和属性都是一个引用,唯一能做的就是更改其左侧引用的内容。请注意,任何其他操作都将直接作用于所引用的值,例如
(左侧引用的对象的查找属性)或[]
(左侧引用的列表/目录的查找元素)
如果您试图用C语言理解Python,请记住:
- 在Python中,没有基元数据类型或基元类型的变量
- 赋值总是影响变量引用的内容,就像在C中赋值给指针一样
- 任何其他操作都会使用和/或影响引用值,因此可以将其视为自动取消引用。特别是,
对应于a.b
或a->b
)(*a).b
element[0]=
实际上调用了列表对象上的一个方法,这就是它发生变化的原因。是“[0]”方法还是“[0]=”方法?在我自己的类中,我不能有一个方法返回我可以赋值的引用。