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

Python对象属性困惑:删除某列表属性元素为何影响另一列表?

问题分析与解决方案:列表引用导致的意外修改

先还原你的问题场景:
你的代码:

data = [0,1,2,3,4,5]
class test():
    def __init__(self,data):
        self.data=data
        self.data2=data
    def main(self):
        del self.data2[3]
test_var = test(data)
test_var.main()
print(test_var.data)
print(test_var.data2)

预期输出:

[0,1,2,3,4,5]
[0,1,2,4,5]

实际输出:

[0,1,2,4,5]
[0,1,2,4,5]

问题根源:可变对象的引用传递

这是Python里非常常见的新手坑——可变对象的赋值是引用传递,不是值复制。

列表、字典、集合这类属于可变对象,当你执行self.data = data和self.data2 = data时,并没有把data列表复制两份,而是让self.data和self.data2这两个变量都指向了内存中同一个列表对象。所以不管你通过哪个变量去修改这个列表(比如del self.data2[3]),本质上都是在修改同一个内存里的原对象,自然两个属性的输出都会跟着变。


解决方案:创建独立的列表副本

要让self.data和self.data2成为互相独立的列表,你需要在赋值时创建原列表的副本,常用的三种方法如下:

方法1:使用列表的copy()方法

data = [0,1,2,3,4,5]
class test():
    def __init__(self,data):
        self.data = data.copy()  # 创建副本
        self.data2 = data.copy() # 创建另一个独立副本
    def main(self):
        del self.data2[3]
test_var = test(data)
test_var.main()
print(test_var.data)
print(test_var.data2)

方法2:使用切片语法[:]

切片[:]会返回一个包含原列表所有元素的新列表:

def __init__(self,data):
    self.data = data[:]
    self.data2 = data[:]

方法3:使用list()构造函数

list()构造函数会基于原列表创建一个新列表:

def __init__(self,data):
    self.data = list(data)
    self.data2 = list(data)

修改后运行代码,就能得到你预期的输出:self.data保持原列表不变,只有self.data2被修改。


内容的提问来源于stack exchange,提问作者Nazzaroth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:42:35