-1
考虑在Python 3.5.2以下代码:使用类型的字典作为属性在Python 3
class NewObj():
def __init__(self, refs={}):
self.refs = refs
class ObjA(NewObj):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
class ObjB(NewObj):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.refs['c'] = 3
a = ObjA(refs={'a':1, 'b': 2})
b = ObjA()
c = ObjB()
lst = [a, b, c]
for obj in lst:
print('%s has refs: %s' % (obj, obj.refs))
代码的输出是:
<__main__.ObjA object at 0x7f74f0f369b0> has refs: {'a': 1, 'b': 2}
<__main__.ObjA object at 0x7f74f0f36a90> has refs: {'c': 3}
<__main__.ObjB object at 0x7f74f0f36ac8> has refs: {'c': 3}
它是输出的秒线这使我感到困惑 - 在我看来应该输出一个空字典。原因是因为b
被分配了一个ObjA
的实例而没有调用任何参数,所以根据默认初始化,b.refs == {}
应该是True
。
这是一个错误或期望的行为?如果它不是一个bug,能否请我解释为什么这是所需的行为,以及为获得我想要的输出的代码的最小改变(即当没有提供参数时,.refs
被初始化为空dict)?
这是一个众所周知的情况下新的Python程序员就可以得到意外。当定义函数时,使用'refs = {}'声明的默认参数只创建一次。所有使用默认值的调用都会获得对同一个字典的引用(而不是每个字典的新空字典)。 – Blckknght