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

Python中__init__内列表变量引用重叠问题求助

解决Python列表实例变量同步修改的问题

你遇到的问题本质是列表是可变对象,直接赋值只是传递引用,不是创建新的副本。当执行self.b = self.a时,self.b并没有生成新的列表,而是和self.a指向内存里同一个列表对象。后续修改self.a的元素时,self.b因为指向同一个对象,自然会同步变化。你之前尝试的中间变量赋值,本质还是传递引用,所以无法解决问题。

看你的代码:第一次调用func时,self.a变成[1,0],此时self.b还是初始化的[0,0],所以self.a == self.b返回False;但执行self.b = self.a后,self.b就和self.a绑定到同一个列表了。第二次调用func修改self.a[0]时,self.b会跟着变化,此时self.a == self.b就会返回True。

修正方案:给列表创建副本

要解决这个问题,需要给self.b赋值self.a的独立副本,而不是直接引用。常用三种方法:

  1. 切片创建副本
class A:
    def __init__(self):
        self.a = [0,0]
        self.b = [0,0]
    def func(self):
        self.a[0] += 1
        print(self.a,self.b,self.a == self.b) # 按预期返回False
        self.b = self.a[:]  # 用切片生成新列表副本
run = A()
for i in range(10):
    run.func()
  1. list()构造函数创建副本
    把self.b = self.a[:]替换成self.b = list(self.a),效果完全一致。

  2. copy模块创建副本
    先导入copy模块,再用copy.copy()生成副本,这种方法适用于更多可变对象类型:

import copy

class A:
    def __init__(self):
        self.a = [0,0]
        self.b = [0,0]
    def func(self):
        self.a[0] += 1
        print(self.a,self.b,self.a == self.b)
        self.b = copy.copy(self.a)
run = A()
for i in range(10):
    run.func()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 19:42:05