Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无目的地写入变量_Python_Python 2.7 - Fatal编程技术网

Python 无目的地写入变量

Python 无目的地写入变量,python,python-2.7,Python,Python 2.7,我不确定这里是否适合我的问题,但我正在处理一些非常奇怪的事情 在我的脚本中,我有一个类data(),它只是各种常量和数据类型的容器。其中一种数据类型是如下所示的字典: testStatus = { 'checkpoint': None, 'tests_Executed': [], 'tests_Passed': [], 'tests_FailedFromRegression': [],

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

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

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已测试并工作!