Python 无目的地写入变量
我不确定这里是否适合我的问题,但我正在处理一些非常奇怪的事情 在我的脚本中,我有一个类data(),它只是各种常量和数据类型的容器。其中一种数据类型是如下所示的字典:Python 无目的地写入变量,python,python-2.7,Python,Python 2.7,我不确定这里是否适合我的问题,但我正在处理一些非常奇怪的事情 在我的脚本中,我有一个类data(),它只是各种常量和数据类型的容器。其中一种数据类型是如下所示的字典: testStatus = { 'checkpoint': None, 'tests_Executed': [], 'tests_Passed': [], 'tests_FailedFromRegression': [],
testStatus = { 'checkpoint': None,
'tests_Executed': [],
'tests_Passed': [],
'tests_FailedFromRegression': [],
'tests_FailedFromRetest': [],
'tests_PassedFromRetest': [] }
self.lastTestStatus = self.testStatus
self.currentTestStatus = self.testStatus
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"])
我的意图是将此字典用作我所称的“上次测试状态”和“当前测试状态”的数据类型。在我的主类的构造函数中,我有如下内容:
testStatus = { 'checkpoint': None,
'tests_Executed': [],
'tests_Passed': [],
'tests_FailedFromRegression': [],
'tests_FailedFromRetest': [],
'tests_PassedFromRetest': [] }
self.lastTestStatus = self.testStatus
self.currentTestStatus = self.testStatus
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"])
奇怪的部分发生在我的主类的run()函数中。这是类的主要辅助函数。在获得一些以前保存的状态,并建立一个包含所有以前测试的项目的列表后,self.currentTestStatus会被写入,即使我没有接触它。代码如下所示:
testStatus = { 'checkpoint': None,
'tests_Executed': [],
'tests_Passed': [],
'tests_FailedFromRegression': [],
'tests_FailedFromRetest': [],
'tests_PassedFromRetest': [] }
self.lastTestStatus = self.testStatus
self.currentTestStatus = self.testStatus
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位
非常感谢 这样我们就有了答案---
self.lastTestStatus
和self.currentTestStatus
是对同一对象的引用。当你改变一个,你改变另一个,因为他们实际上是同一个对象。取而代之的是
import copy
self.lastTestStatus = copy.deepcopy(self.testStatus)
self.currentTestStatus = copy.deepcopy(self.testStatus)
为了复制字典和它们的列表-- 我猜这就是问题所在
self.lastTestStatus
和self.currentTestStatus
是对同一对象的引用。当你改变一个,你改变另一个,因为他们实际上是同一个对象。相反,请执行self.lastTestStatus=copy.deepcopy(self.testStatus)
和self.currentTestStatus=copy.deepcopy(self.testStatus)
,以复制字典及其保存的列表。作为记录,您已经将python风格的指南抛出了窗口。我们使用带有下划线的lowercase\u,而不是camelCase
作为方法名和obj。getAttrib()
在python中是一个很大的禁忌。只需直接获取属性obj.attrib
,并使用@property
。这不是java@非常感谢你的建议。我不是Python方面的专家。我是如何在代码中使用obj.getAttrib()的?干杯@FHTMitchell已测试并工作!