listOne = [1, 2, 3]
listTwo = listOne
print(listOne) #[1, 2, 3]
listTwo.append(4)
print(listOne) #[1, 2, 3, 4]
print(listtwo) #[1, 2, 3, 4]
我怀疑的是,我们将listOne分配给列表2。那就是listTwo指向listOne。所以当我们将值附加到listTwo时,为什么它也反映在listOne中呢?我是python的新手。请帮帮我。
答案 0 :(得分:1)
在Python中,一切都是一个对象,这意味着一切都有自己的记忆。
初始化listOne = [1, 2, 3]
时,会给它一个内存地址。
然后,您使用赋值运算符=
将listOne
的内存位置分配给listTwo
。
所以如果我们举个例子:
listOne = [1, 2, 3]
listTwo = listOne
我们可以这样做:
listOne is listTwo
#Output: True
有人提到你可以使用切片运算符:
,但这会给你一个浅的副本。如果您不熟悉Shallow和Deep Copy之间的区别,请阅读这些docs。基本上,Shallow Copy是一个新的外部容器对象([ ]
,内部元素是对相同内存位置的引用。深层复制也是一个新的外部容器,但内部对象的全新副本(即对象的相同副本,但在新的内存位置)。
我给你留下这个非主要类型的浅拷贝的例子(即不像你的int
那样):
>>> class Sample:
def __init__(self, num):
self.num = num
self.id = id(self)
>>> s1 = Sample(1)
>>> s2 = Sample(2)
>>> listOne = [s1, s2]
>>> listOne[0].num
1
>>> listOne[0].id
88131696
>>> listOne[1].num
2
>>> listOne[1].id
92813904
# so far we know that listOne contains these unique objects
>>> listTwo = listOne
>>> listTwo[0].num
1
>>> listTwo[0].id
88131696
>>> listTwo[1].num
2
>>> listTwo[1].id
92813904
# well shoot, the two lists have the same objects!
# another way to do show that is to simply print the lists
>>> listOne
[<__main__.Sample object at 0x0540C870>, <__main__.Sample object at 0x05883A50>]
>>> listTwo
[<__main__.Sample object at 0x0540C870>, <__main__.Sample object at 0x05883A50>]
# those odd number sequences are hexadecimal and represent the memory location
# to prove the point further, you can use the built in hex() with id()
>>> hex(listOne[0].id) # id is 88131696 from above
'0x540c870'
答案 1 :(得分:0)
listOne
指向列表的内容。然后listTwo = listOne
将只为该列表创建另一个指针(listTwo
)。所以当你对任一指针做任何事情时,例如listTwo.append(4)
,您将影响listOne
和listTwo
指向的列表。
要制作列表的副本,请使用listTwo = listOne[:]
,这将创建一个listTwo
指向的全新列表。
答案 2 :(得分:0)
使用=符号将列表复制到另一个列表时,列表都会引用内存中的相同列表对象。因此修改一个列表,其他列表会自动更改,因为它们都引用同一个对象。要复制列表,请使用切片操作符或复制模块。
>>>list1=[1,2,3]
>>>list2=list1[:]
>>>list2.append(4)
>>>list1
[1,2,3]
>>>list2
[1,2,3,4]
>>>import copy
>>>list3=copy.deepcopy(list1)
>>> list3.append(4)
>>>list1
[1,2,3]
>>>list3
[1,2,3,4]