在尝试运行一些单元测试(python 2.7)时,我看到了一些与变量范围相关的奇怪行为:
我有一个包含一个名为“Dummy”的类的模块,它有一个列表作为实例变量。在我对该模块的单元测试中,我有两个单独的测试用例,每个测试用例都创建自己单独的 Dummy 实例。然而,第二个运行的测试中的 Dummy 实例似乎包含在第一个测试中创建的列表。这是代码:
我的模块.py:
class Dummy(object):
def __init__(self, mylist=[]):
self.mylist = mylist
test_mymodule.py:
class TestDummy(unittest.TestCase):
def testDummy1(self):
d1 = Dummy() # d1.mylist is empty, []
d1.mylist.append(1) # mylist = [1]
self.assertEqual(d1.mylist, [1])
def testDummy2(self):
d2 = Dummy() # d2.mylist = [1] !
d2.mylist.append(2) # d2.mylist = [1,2]
self.assertEqual(d2.mylist, [2]) # FAILS
额外细节:
如果我将 a
print mylist
作为 Dummy 的init方法的第一行,果然,在第二次测试运行时,它会打印 [1],就好像 mylist=[1] 作为参数传入一样如果我明确指定
dd = Dummy(mylist=[])
,那么问题就会消失。它似乎与默认参数值有关,但我不清楚为什么无论如何它应该溢出到不同的范围。