欢迎来到代码驿站!

Python代码

当前位置:首页 > 软件编程 > Python代码

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

时间:2022-12-06 13:36:38|栏目: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 = ['', '', '']),之后各个修改值

Python默认值参数

简单粗暴上代码

def fun(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]。

如果不行出现当前这种情况,而是在函数每次被调用的时候都初始化一次变量

可以用下面这种写法

def function(a, b=None):
    b = b if b else []  # 明确每次重新定义b
    b += [a]
    print(b)

function(1)
function(2, [])
function(3)

输出结果:

[1]
[2]
[3]

上一篇:Python学习之异常处理的避坑指南

栏    目:Python代码

下一篇:基于Python实现音乐播放器的实现示例代码

本文标题:Python的类成员变量默认初始值的坑及解决

本文地址:http://www.codeinn.net/misctech/220714.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有