我对Python比较陌生,所以在基础知识方面遇到了困难。我有以下代码,在循环内打印正确的列表值,但在循环外它只显示最后一个值:
for item in statusEntries:
theNameStatus = item[3] #get the numStatus field data
if theNameStatus == 1:
numStatus1 = item[2] #get cntStatus
elif theNameStatus == 2:
if numStatus1 > 0:
theNameStatus = "closed"
sctStatus["nameStatus"] = theNameStatus
sctStatus["IDstatus"] = item[0]
sctStatus["cntStatus"] = item[2]
#Appending Status Array with Status Attribute Object
sctResponse["STATUSOPTION"].append(sctStatus)
当我在循环中打印sctResponse[“STATUSOPTION”]时,它会在每次迭代中显示正确的值,但当它在最后一次迭代中到达时,它只会用最后一个循环值填充它:
{'STATUSOPTION': [{'nameStatus': 1, 'cntStatus': 0, 'IDstatus': 6}]}
{'STATUSOPTION': [{'nameStatus': 2, 'cntStatus': 0, 'IDstatus': 1}, {'nameStatus': 2, 'cntStatus': 0, 'IDstatus': 1}]}
{'STATUSOPTION': [{'nameStatus': 3, 'cntStatus': 0, 'IDstatus': 7}, {'nameStatus': 3, 'cntStatus': 0, 'IDstatus': 7}, {'nameStatus': 3, 'cntStatus': 0, 'IDstatus': 7}]}
{'STATUSOPTION': [{'nameStatus': 4, 'cntStatus': 0, 'IDstatus': 4}, {'nameStatus': 4, 'cntStatus': 0, 'IDstatus': 4}, {'nameStatus': 4, 'cntStatus': 0, 'IDstatus': 4}, {'nameStatus': 4, 'cntStatus': 0, 'IDstatus': 4}]}
{STATUSOPTION':[{nameStatus':5,'cntStatus':0,'IDstatus':5},{nameStatus':5,'cntStatus':0,'IDstatus':5},{nameStatus':5,'cntStatus':0,'IDstatus':5},{nameStatus':5},{nameStatus':0,'IDstatus':5}]}
正如您看到的最后一条粗体记录,所有值都被清除,并用最后一条记录填充。为什么会这样?附加应该附加而不是删除它,不是吗?你知道吗
假设循环如您所示,那么在我看来只有一个
sctStatus
字典,并且您不断更改它的"namestatus"
、"IDstatus"
和"cntStatus"
键值对。尝试插入sctStatus = {}
,即所以你每次都要加一本新字典。你知道吗
对
sctStatus
的引用始终是对同一字典的引用-当您append
将该字典添加到sctResponse
列表时,您并没有附加字典的副本,而是向其添加引用。每次将最后一行更改为sctResponse["STATUSOPTION"].append(sctStatus.copy())
或创建一个新的sctStatus
字典。你知道吗将打印:
发生什么事了?Python是pass-by-name——除非处理原语值,否则几乎总是按值传递这些伪指针。当您将
sctStatus
附加到列表时,您将附加一个名称,它仍然指向内存中的同一个sctStatus
字典。当你修改字典的时候,所有指向它的名字现在都会调出changed字典。你知道吗另请参见Other Languages have variables,以获得对这种行为的另一个很好的解释。你知道吗
相关问题 更多 >
编程相关推荐