Python 列表引用的规则?

Python 列表引用的规则?,python,Python,我对python中的列表引用感到非常困惑。请帮我理解。下面是一个简单的例子: arr1 = [] arr2 = [1, 2] arr1.append(arr2) #arr2[0] = 5 arr2 = [6] print(arr1) 因此,在将arr2附加到arr1而不进行深度复制之后,据我所知,arr2上的任何更改都将反映在arr1中。但是,只有更改组件(如arr2[0]=5)才能更新arr1,而arr2=[6]则不会。有什么原因吗?当您执行arr2=[6]时,您将创建一个新的列表对象,该对

我对python中的列表引用感到非常困惑。请帮我理解。下面是一个简单的例子:

arr1 = []
arr2 = [1, 2]
arr1.append(arr2)
#arr2[0] = 5
arr2 = [6]
print(arr1)

因此,在将
arr2
附加到
arr1
而不进行深度复制之后,据我所知,
arr2
上的任何更改都将反映在
arr1
中。但是,只有更改组件(如
arr2[0]=5
)才能更新
arr1
,而
arr2=[6]
则不会。有什么原因吗?

当您执行
arr2=[6]
时,您将创建一个新的列表对象,该对象现在由arr2引用。列表中的引用仍然指向初始列表,因此您不能再使用标签arr2来更改arr1中引用的列表的内容。

当您执行
arr2=[6]
时,您将创建一个新的列表对象,该对象现在由arr2引用。列表中的引用仍然指向初始列表,因此您不能再使用标签arr2来更改arr1中引用的列表的内容

据我所知,arr2的任何变化都将反映在arr1中

这对于变异是正确的,但将新对象指定给标签不会使对象变异,您将在内存中创建一个新的列表对象
[6]
,并将其指定给该标签
arr2
现在指向这个新对象(具有不同的
id()
),而不是存储在
arr1
中的对象

列表对象是可变的,因此可以使用
.append()
方法对其进行变异。在这种情况下,使用
.append()
arr2
的任何更改都将反映存储在
arr1

arr1 = []
arr2 = [1, 2]
arr1.append(arr2)

arr2.append(6)
print(arr1)
无论何时,只要检查它们是否是相同的对象,只需在前后打印ID即可。如果发生突变:

print(id(arr1[0])) # 2157378023744
print(id(arr2))    # 2157378023744
据我所知,arr2的任何变化都将反映在arr1中

这对于变异是正确的,但将新对象指定给标签不会使对象变异,您将在内存中创建一个新的列表对象
[6]
,并将其指定给该标签
arr2
现在指向这个新对象(具有不同的
id()
),而不是存储在
arr1
中的对象

列表对象是可变的,因此可以使用
.append()
方法对其进行变异。在这种情况下,使用
.append()
arr2
的任何更改都将反映存储在
arr1

arr1 = []
arr2 = [1, 2]
arr1.append(arr2)

arr2.append(6)
print(arr1)
无论何时,只要检查它们是否是相同的对象,只需在前后打印ID即可。如果发生突变:

print(id(arr1[0])) # 2157378023744
print(id(arr2))    # 2157378023744

arr2=[6]
创建一个全新的列表,并将其分配给名称arr2,与用于引用的列表arr2无关,而arr1仍有此功能。我建议使用,例如,
arr2=[6]
不会改变任何东西。还要注意的是,这些行为都与列表无关。Python的语义不会根据对象imvolved的类型进行特殊处理。无论如何,请阅读以下内容:
arr2=[6]
创建一个全新的列表并将其分配给名称arr2,与用于引用的列表arr2无关,而arr1仍然如此。我建议使用,例如,
arr2=[6]
不会改变任何东西。还要注意的是,这些行为都与列表无关。Python的语义不会根据imvolved对象的类型生成特殊情况。无论如何,请阅读以下内容:
is
通常是更好的way@juanpa.arrivillaga是的,比处理数字要好。
通常是更好的选择way@juanpa.arrivillaga是的,比处理数字要好。