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

在第一种情况下,pyhton为列表中的每个值创建一个新变量,并且不对变量应用旧引用。但在第二种情况下,python为整个列表创建了一个新变量,而不是为每个变量。所以,列表中元素的引用保持不变,并更改了paricular元素。在第三种情况下,它创建一个与第二种情况类似的变量,并将变量作为一个整体进行更改,但不是每个元素的值。

Python中的变量只是对象的“名称”。赋予一个名称会改变该名称所指的内容;它对名称所引用的旧对象没有任何作用
element[0]=
实际上调用了列表对象上的一个方法,这就是它发生变化的原因。是“[0]”方法还是“[0]=”方法?在我自己的类中,我不能有一个方法返回我可以赋值的引用。