Python的类成员变量默认初始值的坑

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python的类成员变量默认初始值的坑相关的知识,希望对你有一定的参考价值。

问题发现:一个循环内,缺省值初始化同名变量,其中的list成员不是空,会延续之前同名变量的值。


示例代码:

# Define class
class Variant():
    # use
    def __init__(self, price = 500, description = ‘default description‘, values = [‘‘, ‘‘, ‘‘]):
        self.price = price
        self.description = description
        self.values = values

    def __str__(self):
        return ‘price: {}, description: {}, values: {}‘.format(self.price, self.description, self.values)

variant_list = []
# Create instance with same name iteratively
for i in range(3):
    current_variant = Variant()
    if i == 1:
        current_variant.values[2] = ‘hello‘
    current_variant.price = i
    current_variant.description = ‘description of variant: {}‘.format(i)
    variant_list.append(current_variant)

# Test results
for variant in variant_list:
    print(str(variant))

结果:所有实例的values列表值相同


原因:“可选参数默认值的设置在Python中只会被执行一次,也就是定义该函数的时候”如此使用缺省值初始化,list成员指向的是同一个list(地址),如果只是修改其中一个元素(而不是赋值新的list开辟新内存),那么所有instance的list成员都会被修改。


解决方法:直接在构造方法中置为空(self.values = [‘‘, ‘‘, ‘‘]),之后各个修改值


reference:Python 类成员变量使用缺省值初始化时要注意的一个坑
Python程序员最常犯的十个错误

以上是关于Python的类成员变量默认初始值的坑的主要内容,如果未能解决你的问题,请参考以下文章

在构造函数代码之前禁用默认类成员初始化

随笔25 java中的类加载顺序

java中,在实例化一个类时,这个类中没有初始值的int类型成员变量i,i的值是否0?

工具,Visual Studio 设置来检查未初始化的类成员

final成员变量

在 C++ 中创建具有 2 个双精度值的类