未调用修改方法时List数据莫名变更问题求助(附代码示例)
问题根源与解决方案
哦,我立刻就发现问题所在了——你的copyFrom方法只是简单地做了引用赋值,而Python中的列表是可变引用类型,这就导致新栈的_data和原栈dequeuedStack的_data指向了内存中的同一个列表对象。所以当你给新栈执行push操作时,原栈的列表也会被意外修改!
为什么会这样?
来看你的copyFrom代码:
def copyFrom(self, aStack): self._data = aStack._data
这行代码并没有创建一个新的列表副本,只是把self._data的引用指向了aStack._data所引用的列表。两个变量共享同一个底层列表,不管哪一方修改这个列表,另一方都会同步看到变化——这就是为什么你没修改dequeuedStack,它的_data却变了。
如何解决?
你需要创建原列表的浅拷贝,让新栈的_data指向一个全新的列表对象,而不是和原栈共享同一个。这里有几种简单的实现方式:
方法1:使用列表切片
这是Python中创建列表浅拷贝最常用的方式:
def copyFrom(self, aStack): self._data = aStack._data[:]
方法2:使用list()构造函数
通过构造函数生成新列表:
def copyFrom(self, aStack): self._data = list(aStack._data)
方法3:使用copy模块(适合更复杂场景)
如果你的列表中包含可变对象(比如嵌套列表),可以用copy模块的浅拷贝方法(不过你的场景里都是字符串,前两种方法足够):
import copy def copyFrom(self, aStack): self._data = copy.copy(aStack._data)
修改后的效果
修改copyFrom方法后,再运行你的代码,dequeuedStack._data就不会再被意外修改了。比如你的输出会变成:
['stone', 'atone'] before ['stone', 'atone'] after ['stone', 'atone', 'alone'] after copying ['stone', 'atone'] alone before ['stone', 'atone'] after ['stone', 'atone', 'clone'] after copying ['stone', 'atone'] clone
完全符合你预期的行为。
内容的提问来源于stack exchange,提问作者leongwq
相关产品推荐
相关产品推荐

