无意中写入变量

2024-06-16 11:10:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我不确定这里是否适合我的问题,但我正在处理一些非常奇怪的事情。你知道吗

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

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

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

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

奇怪的部分发生在我的主类的run()函数中。这是类的主要worker函数。在获得一些先前保存的状态,并建立一个包含所有先前测试项的列表之后,自我电流测试状态即使我不碰它也会被写下来。代码如下所示:

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中使用Python 2.7.10 32位

非常感谢!你知道吗


Tags: selfdata字典teststhis数据类型extend测试状态
1条回答
网友
1楼 · 发布于 2024-06-16 11:10:33

所以我们有个答案-

self.lastTestStatusself.currentTestStatus是对同一对象的引用。当你改变一个,你改变另一个,因为他们实际上是同一个对象。相反,你应该这样做

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

为了复制字典和他们持有的列表docs。你知道吗

相关问题 更多 >