列表神秘地改变

时间:2016-04-13 00:13:11

标签: python list function

我是编程新手。我写了一些令我困惑的Python代码。我有一个名为“board”的列表,我创建了一个名为“newlist”的新列表。我使用名为cupdateboard()的函数创建了新列表,该函数将列表,电路板和另一个参数作为输入。我不期待董事会改变,但确实如此。有人可以向我解释为什么董事会已经改变了,以及如何在不改变董事会的情况下创建基于董事会的新板?

def cupdateboard(cmove,lst):
    newlst=lst
    number=cmove+newlst[cmove]
    newlst[cmove]=0
    if number<=13:
        for i in range(cmove+1,number+1):
            newlst[i]+=1
    elif number>13 and number<=19:
        for i in range(cmove+1,14):
            newlst[i]+=1
        for i in range(0,number-13):
            newlst[i]+=1
    elif number>19:
        for i in range(cmove+1,14):
            newlst[i]+=1
        for i in range(0,6):
            newlst[i]+=1
        for i in range(7,7+(number-19)):
            newlst[i]+=1

    return newlst

board=[4,4,4,4,4,4,0,4,4,4,4,4,4,0]
cmove=7
newboard=cupdateboard(cmove,board)
print(newboard)
print(board)
input("Press enter to quit")

1 个答案:

答案 0 :(得分:3)

为什么会发生这种情况

在Python中分配可变数据类型会创建数据类型的shallow copy

换句话说,做

s = [1,2,3]
v = s
v[0] = 200

也会导致s成为[200, 2, 3]

s的浅表副本意味着v创建s的新副本,其元素引用到内存中s的原始元素 - v[i]指向原始s[i]引用的内存位置,而不是指向内存中具有s[i]副本的新位置。显然,这意味着当您更改v[i]时,会覆盖内存位置,这样,当s[i]查看其值时,它会看到一个新值并在被询问时返回该值。

当您执行newlst = lst并对newlst[i]进行更改时,就会发生这种情况。你也不小心修改了lst[i],因为复制很浅。字典和其他可变对象也会出现同样的问题。 (不可变对象,如字符串,元组等,不会遇到这个问题,因为它们是不可变的。)

解决方案

要解决此问题,您需要进行深度复制 - 创建s的新副本,其中所有元素都指向元素的全新值(即不指向原始的相同内存位置{ {1}}的元素,但采用相同的元素,在一个全新的内存位置制作每个元素的副本,并使s指向新的内存位置。

简单地做

v[i]

应该解决你的问题。