变量无意写入

时间:2018-07-10 13:44:06

标签: python python-2.7

不确定这是否是我提出问题的正确地方,但是我正在处理一些很奇怪的事情。

在我的脚本中,我有一个类data(),它只是各种常量和各种数据类型的容器。这些数据类型之一是字典,如下所示:

testStatus = { 'checkpoint': None,
               'tests_Executed': [],
               'tests_Passed': [],
               'tests_FailedFromRegression': [], 
               'tests_FailedFromRetest': [], 
               'tests_PassedFromRetest': [] }

我的意图是将此字典用作我所说的数据,上次测试状态和当前测试状态的数据类型。在我的主类的构造函数中的某个地方,我有这样的东西:

self.lastTestStatus = self.testStatus
self.currentTestStatus = self.testStatus

奇怪的部分发生在我的主类的run()函数中。这是该类的主要辅助功能。在获得一些先前保存的状态并建立一个包含所有先前测试过的项目的列表之后,即使我没有触摸self.currentTestStatus也会被写入。代码如下:

self.getTestStatus()
#All good after this line. 
#This is a function that uses self.lastTestStatus to save the previous status.
#After running this line, self.lastTestStatus["tests_FailedFromRegression"] will hold a list with some items. This is just script testing data.

previouslyTested = []
previouslyTested = self.lastTestStatus["tests_Passed"]
#All good after these two lines.

previouslyTested.extend(self.lastTestStatus["tests_FailedFromRegression"])
#At this point, self.currentTestStatus["tests_Passed"] gets the same value as self.lastTestStatus["tests_FailedFromRegression"] has.

previouslyTested.extend(self.lastTestStatus["tests_FailedFromRetest"])
previouslyTested.extend(self.lastTestStatus["tests_PassedFromRetest"])

有人知道我在这里到底在做什么错吗?如果我使用testStatus2作为当前状态,与testStatus相同,则一切正常。

我在Spyder 3.0.0dev中使用32位Python 2.7.10。

非常感谢!

1 个答案:

答案 0 :(得分:0)

就这样我们有一个答案---

self.lastTestStatusself.currentTestStatus是对同一对象的引用。突变一个时,您突变另一个,因为它们实际上是同一对象。代替

import copy
self.lastTestStatus = copy.deepcopy(self.testStatus)
self.currentTestStatus = copy.deepcopy(self.testStatus)

为了复制字典及其所保存的列表-docs