python中的append()函数行为奇怪

时间:2014-02-08 18:15:22

标签: python

这是代码:

import random
mylist=[]
position=[300,300]
while 1:
    randomint = random.randint(1,3)
    print mylist
    if randomint == 3:
        position[0]+=5
        mylist.append(position)

而不是:

[]
[[305, 300], [310, 300]]
[[305, 300], [310, 300], [315, 300]]
[[305, 300], [310, 300], [315, 300]]
[[305, 300], [310, 300], [315, 300]]

... 我明白了:

[]
[[305, 300]]
[[305, 300]]
[[305, 300]]
[[305, 300]]
[[305, 300]]
[[305, 300]]
[[310, 300], [310, 300]]
[[315, 300], [315, 300], [315, 300]]
[[315, 300], [315, 300], [315, 300]]
[[315, 300], [315, 300], [315, 300]]
[[315, 300], [315, 300], [315, 300]]
[[315, 300], [315, 300], [315, 300]]
[[315, 300], [315, 300], [315, 300]]
[[315, 300], [315, 300], [315, 300]]
[[315, 300], [315, 300], [315, 300]]
[[320, 300], [320, 300], [320, 300], [320, 300]]
...

为什么呢?这很奇怪,不是吗?

1 个答案:

答案 0 :(得分:3)

每次将position追加到列表中时,只会添加引用,而不是副本。然后打印mylist时,您会看到多次打印相同的共享列表。

使用切片语法附加时创建副本:

mylist.append(position[:])

这里position[:]从头到尾创建一个切片,返回一个带有浅拷贝的新列表对象。