Я не знаю, почему оригинальный список меняется при изменении псевдонима списка - PullRequest
0 голосов
/ 04 июня 2019

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 ]

2 голосов
/ 04 июня 2019

Как упоминал @chepner, вы сделали только поверхностную копию l, вам нужно сделать глубокую копию:

from copy import deepcopy
...
lCopy = deepcopy(l)
1 голос
/ 04 июня 2019

Как заметил @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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...