Python的类成员变量默认初始值的坑及怎么解决
这篇文章主要讲解了“Python的类成员变量默认初始值的坑及怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python的类成员变量默认初始值的坑及怎么解决”吧!
类成员变量默认初始值的坑问题发现一个循环内,缺省值初始化同名变量,其中的list成员不是空,会延续之前同名变量的值。
示例代码#DefineclassclassVariant():#usedef__init__(self,price=500,description='defaultdescription',values=['','','']):self.price=priceself.description=descriptionself.values=valuesdef__str__(self):return'price:{},description:{},values:{}'.format(self.price,self.description,self.values)variant_list=[]#Createinstancewithsamenameiterativelyforiinrange(3):current_variant=Variant()ifi==1:current_variant.values[2]='hello'current_variant.price=icurrent_variant.description='descriptionofvariant:{}'.format(i)variant_list.append(current_variant)#Testresultsforvariantinvariant_list:print(str(variant))结果
所有实例的values列表值相同
原因可选参数默认值的设置在Python中只会被执行一次,也就是定义该函数的时候”如此使用缺省值初始化,list成员指向的是同一个list(地址),如果只是修改其中一个元素(而不是赋值新的list开辟新内存),那么所有instance的list成员都会被修改。
解决方法直接在构造方法中置为空(self.values = ['', '', '']),之后各个修改值
Python默认值参数简单粗暴上代码deffun(a,b=[]):b+=[a]print(b)fun(1)fun(2,[])fun(3)
是不是看上去很简单,其实暗藏玄机,请大家看一下输出结果,是不是有点让你疑惑^^~
[1]
[2]
[1, 3]
此时你是否也和我有一样的疑惑,为什么 fun(3) 的输出结果是 [1, 3]?
哈哈,不卖关子了,这里是因为,因为函数被定义好后,只会生成一次,所以在函数生成的时候定义的变量 b 的默认值也只会被初始化一次。
因此,当执行fun(1)函数时,没有给 b 传参,所以使用的是 b 的默认值,此时 b 的默认值为[1]。
执行fun(2,[])时,给 b 传了一个[]值(恰好和默认值相同,其实是不同的数据),因此便使用的是传入数据,执行结果便是[2]。
然后在执行fun(3),此刻又没有给 b 传参,所以依旧使用的是 b 的默认值, 而 b 的默认值只会随着函数的生成被生成一次 ( fun(1) 生成过了 ),所以现在的默认值是fun(1)的执行结果[1],因此当fun(3)再次调用时,输出结果便会是[1, 3]。
如果不行出现当前这种情况,而是在函数每次被调用的时候都初始化一次变量
可以用下面这种写法deffunction(a,b=None):b=bifbelse[]#明确每次重新定义bb+=[a]print(b)function(1)function(2,[])function(3)
输出结果:
[1]
[2]
[3]
感谢各位的阅读,以上就是“Python的类成员变量默认初始值的坑及怎么解决”的内容了,经过本文的学习后,相信大家对Python的类成员变量默认初始值的坑及怎么解决这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。