我不知道为什么更改列表别名时原始列表也会更改

时间:2019-06-04 00:09:59

标签: python list

lCopy是原始列表l的别名。更改lCopy时,l也更改。我不知道为什么会这样。

def organizingContainers(l):

    ball = 0

    def checkContainers(ball,lCopy):
        print(ball,lCopy,orig)
        while ball<len(lCopy):
            for i,j in enumerate(lCopy):
                print(lCopy,j,ball,j[ball],sum([x[ball] for x in lCopy if x is not lCopy[i]]))
                if j[ball]==sum([x[ball] for x in lCopy if x is not lCopy[i]]):
                    for sl in lCopy:
                        sl[ball]=0
                    print('l',l,'lCopy',lCopy)
                else:
                    continue
            ball+=1
        return lCopy    

    while True:
        print('ball',ball,'l',l)
        lCopy=l[:]
        newL = checkContainers(ball,lCopy)
        print('newL',newL,'l',l,'lCopy',l, 'orig',orig)
        for sL in newL:
            if set(sL)!={0} and ball<len(newL):
                ball+=1            
                break
            elif ball==len(newL):
                return True             

print(organizingContainers ([[0, 2, 1],[1, 1, 1],[2, 0, 0]]))

2 个答案:

答案 0 :(得分:2)

就像@chepner提到的那样,您仅制作了l的浅表副本,而需要制作深表副本:

from copy import deepcopy
...
lCopy = deepcopy(l)

答案 1 :(得分:1)

正如@chepner所说,之所以发生是因为lCopy不是l的别名。您可以用几行代码自行检查它,如下所示。

l = [1,2,3]
lCopy = l
lCopy.append(4)
print(l) #Will give [1,2,3,4]

要更好地了解正在发生的事情,可以创建另一个列表对象u

u = [4,5,6]
lCopy = u
print(lCopy) #Will give [4,5,6]
print(l) #Will still give [1,2,3,4]

创建lCopy = u时,只需将lCopy中包含的引用更改为u而不是l

因此,lCopy不是l的副本。为了能够修改lCopy而不对l产生副作用,您可以使用@DaichiJameson提到的Deepcopy。