当多个变量引用同一个python列表时,如果一个变量的值改变了,其他变量也会自动改变,为什么?[duplicate]

l3zydbqr  于 2022-12-28  发布在  Python
关注(0)|答案(2)|浏览(106)
    • 此问题在此处已有答案**:

Python assigning multiple variables to same value? list behavior(12个答案)
十小时前关门了。
我有下面的小代码在Python中,我改变了list_one的值通过使用pop()函数,但我没有做任何改变list_two.在打印list_onelist_two,他们都打印相同的结果如下所述.

arr = [1,2,3,4,5]
list_one = arr
list_two = arr
list_one.pop(0)

print(list_one)
print(list_two)

Output:
[2, 3, 4, 5]
[2, 3, 4, 5]

有人能帮助我理解为什么list_two也在改变,即使我没有对它做任何改变。我知道list_one和list_two都引用'arr',但我希望list_one创建对修改后的列表的新引用,并希望list_two维护对'arr'的现有引用。
请帮帮我。

pvabu6sv

pvabu6sv1#

原因是当你给list_onelist_two赋值数组时,你基本上是给数组赋值了一个引用,它们指向了相同的资源,所以,因为这两个变量有相同的数组引用,它们不仅有相同的值,而且值**也是相同的。
如果需要,也可以使用copy an array,但是将数组赋给变量并不会复制整个数组。
docs也声明了这一点,如下所示:
Python中的赋值语句不复制对象,它们在目标和对象之间创建绑定。对于可变的或者包含可变项的集合,有时候需要一个副本,这样可以改变一个副本而不改变另一个。这个模块提供了通用的浅和深复制操作(下面解释)。

k97glaaz

k97glaaz2#

我对Python不太了解,但Java中也是如此。我们从头开始:你创建一个列表对象([1,2,3,4,5]),然后把这个列表对象赋给一个变量,这里的要点是你只把列表的地址存储在变量中(你只指向列表),而不是列表本身。
所以如果你现在创建一个新的变量,并让它指向这个列表的地址,你将有两个变量指向同一个地址,或者同一个列表。
所以如果你改变了那个列表,两个变量都指向那个列表,因此会给你一个新的。
我希望A以一种有用和简单的方式描述它;)

相关问题