我在Python3类中遇到了这种特别令人毛骨悚然的行为,由于奇怪的原因,这导致我的测试失败。我已经将代码简化为一个更不可知的示例。
class MyClass:
def __init__(self, d={}, l=[]):
self.d = d
self.l = l
def addEntry(self, line):
""" Line is a space separated list of words. Should be at least 3 long.
"""
entry = line.split()
self.l.append(entry[0])
self.d[entry[1]] = entry[2]
# my unit-tests
def test_one(self):
mc = MyClass()
mc.addEntry('hello line one')
def test_two(self):
mc = MyClass()
self.assertEqual(0, len(mc.l))
test_two
失败是因为0 != 1
,这意味着test_two中的MyClass实例包含一个长度为1的列表。
我可以通过以下方式修复MyClass
来纠正此问题。
class MyClass:
def __init__(self, d={}, l=[]):
self.d = dict(d)
self.l = list(l)
为什么MyClass的新实例似乎共享对其内部成员的引用?