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]]))
答案 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。