2014-02-08 16 views
0

这是代码:的append()函数的行为出现异常

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]] 
... 

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

回答

3

每次将position添加到列表中时,您只能添加一个参考,而不是副本。当打印mylist时,您会看到多次打印相同的共享列表。

与切片语法时附加创建一个副本:

mylist.append(position[:]) 

这里position[:]创建片从开始到结束,返回一个新的列表对象与浅拷贝。