我试图用可变对象作为默认值编写一个类。我知道对于单个功能,我们应该将参数设置为None,并检查该参数,以防该功能的副作用如以下代码所示。但是我想知道当我尝试初始化一个类时如何? 使用可变对象作为变量的默认值的副作用
def func(k, v, para = {}):
para[k] = v
return para
print(func('a', 1)) #expect {'a': 1}, actually return {'a': 1}
print(func('b', 2)) #expect {'a': 1}, actually return {'a': 1, 'b': 2}
print(func('c', 3)) #expect {'a': 1}, actually return {'a': 1, 'b': 2, 'c': 3}
#how about class?
class T
def __init__(self, para = {})
#or
#def __init__(self, para = None)
#para = para or dict()
self.para = para
答案 0 :(得分:1)
最佳实践如下。
来源:Why is the empty dictionary a dangerous default value in Python?
def func(k, v, para=None):
if para is None:
para = dict()
para[k] = v
return para
print(func('a', 1)) #returns {'a': 1}
print(func('b', 2)) #returns {'b': 2}
print(func('c', 3)) #returns {'c': 3}
是的,我敢肯定,这同样适用于类。
class T:
def __init__(self, para=None):
if para is None:
para = dict()
self.para = para
让我们测试一下类会发生什么:
class T:
def __init__(self, k, v, para={}):
self.para = para
self.para[k] = v
print(T('a',1).para) #returns {'a': 1}
print(T('b',2).para) #returns {'a': 1, 'b': 2}
print(T('c',3).para) #returns {'a': 1, 'b': 2, 'c': 3}
是的,这同样适用于类构造函数。