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的类成员变量默认初始值的坑的主要内容,如果未能解决你的问题,请参考以下文章
java中,在实例化一个类时,这个类中没有初始值的int类型成员变量i,i的值是否0?