You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python修改__init__接收参数后,可变非静态类变量代码出错排查

分析:修改__init__接收参数后异常的常见原因

嘿,看起来你大概率踩中了Python里一个经典的新手陷阱——可变默认参数的坑!结合你原本的代码逻辑(每个实例拥有独立的arr列表),我来帮你拆解问题:

你可能的错误修改方式

我猜你把__init__改成了类似这样的写法:

class Cla:
    # 错误:用可变对象([])作为默认参数
    def __init__(self, arr=[]):
        self.arr = arr
    def showIds(self):
        print(str(id(self.arr)))
    def show(self):
        print(self.arr)

为什么这会出问题?

Python里有个容易被忽略的规则:函数的默认参数只会在函数定义的时候初始化一次,而不是每次调用__init__创建实例时重新生成。这就导致所有没有传入arr参数的实例,都会共享同一个列表对象!

比如运行这段错误代码,你会看到完全不符合预期的结果:

a = Cla()
b = Cla()
a.showIds()  # 两个实例的arr会输出同一个内存地址
b.showIds()
a.arr.append(10)
b.show()     # 居然会输出[10],而不是你想要的空列表!

正确的修改姿势

要保证每个实例都拥有独立的可变对象,我们需要在__init__内部动态创建新的列表,而不是依赖默认参数的可变对象:

class Cla:
    # 正确做法:默认参数设为None,内部初始化新列表
    def __init__(self, arr=None):
        # 如果没传参数,创建新的空列表
        if arr is None:
            self.arr = []
        else:
            # 可选:如果传入了列表,最好创建副本,避免外部修改影响实例内部
            self.arr = arr.copy()
    def showIds(self):
        print(str(id(self.arr)))
    def show(self):
        print(self.arr)

验证正确结果

现在运行修改后的代码,就能回到你原本预期的行为:

a = Cla()
b = Cla()
a.showIds()  # 输出不同的内存地址,说明是独立的列表
b.showIds()
a.arr.append(10)
b.arr.append(20)
a.show()     # [10]
b.show()     # [20]

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

火山引擎 最新活动