未调用任何方法更改列表数据时更改

时间:2018-01-18 10:17:05

标签: python

这是我将数据从旧堆栈复制到新堆栈然后将它们排入队列的代码

for word in dictionary:
            if len(word) == len(lastWord):  #Make sure same len
                if (oneLetterDiff(word, dequeuedStack.peek())) == True and (word in dequeuedStack._data) == False: #One letter difference
                    s = MyStack()
                    print 'before %s' % dequeuedStack._data
                    s.copyFrom(dequeuedStack) #Copy stack over
                    s.push(word) #Add new word
                    print 'after %s' % s._data
                    q.enqueue(s) #Enqueue the stack
                    print 'after copying %s' % dequeuedStack._data
                    print word

这是复制列表的代码

def copyFrom(self, aStack):
    self._data = aStack._data

这是将它附加到队列

def enqueue(self, value):
    self._data.append(value)

然而,dequeuedStack._data在我没有调用任何修改方法的情况下被更改了

这是输出的一个例子

['stone', 'atone']
before ['stone', 'atone']
after ['stone', 'atone', 'alone']
after copying ['stone', 'atone', 'alone']
alone
before ['stone', 'atone', 'alone']
after ['stone', 'atone', 'alone', 'clone']
after copying ['stone', 'atone', 'alone', 'clone']
clone

2 个答案:

答案 0 :(得分:2)

Python中的字典是引用。这意味着当您执行self._data = aStack._data时,您实际上将两个词典都设为相同的引用,而不是实际创建新词典并将值复制到其中。

要进行深层复制,请尝试以下操作:

import copy

...

def copyFrom(self, aStack):
    self._data = copy.deepcopy(aStack)

答案 1 :(得分:0)

将我的复制方法更改为列出到self._data = aStack._data[:]并且可以正常工作