将一个列表分配给另一个列表

时间:2018-04-01 04:58:31

标签: python list

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的新手。请帮帮我。

3 个答案:

答案 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),您将影响listOnelistTwo指向的列表。

要制作列表的副本,请使用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]