我在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,'cntStatus':0,'IDstatus':5},{'nameStatus':5,' cntStatus':0,'IDstatus':5}]}
正如您可以看到最后一个粗体记录,所有值都被删除,并用最后一条记录填充它。为什么会这样?附加应该附加而不是擦除它,不是吗?
答案 0 :(得分:2)
对sctStatus
的引用始终是对相同字典的引用 - 当您append
该字典到sctResponse
列表时,您没有附加< em>复制字典,而不是引用。将最后一行更改为sctResponse["STATUSOPTION"].append(sctStatus.copy())
或每次都创建一个新的sctStatus
字典。
status_option = []
sctStatus = {}
for i in range(1, 3):
sctStatus["integer"] = i
status_option.append(sctStatus)
print "Round", i, "->", status_option
将打印:
Round 1 -> [{"integer": 1}]
Round 2 -> [{"integer": 1, "integer": 2}, {"integer": 1, "integer": 2}]
Round 3 -> [{"integer": 1, "integer": 2, "integer": 3},
{"integer": 1, "integer": 2, "integer": 3},
{"integer": 1, "integer": 2, "integer": 3}]
发生什么事了? Python是pass-by-name - 除非你处理一个原始值,否则你几乎总是按值传递这些伪指针。当您将sctStatus
追加到列表中时,您附加的名称仍然指向内存中相同的sctStatus
字典。当您更改该字典时,指向它的所有名称现在都会拉出已更改的字典。
另请参阅Other Languages have variables以获取有关此行为的其他详细说明。
答案 1 :(得分:1)
假设循环正如你所显示的那样,那么我认为只有一个sctStatus
字典,并且你不断更改其"namestatus"
,"IDstatus"
和{ {1}}键值对。尝试插入"cntStatus"
,即
sctStatus = {}
这样您每次都会附加一个新词典。