You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

未调用修改方法时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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:38:47