gpt4 book ai didi

Python:附加带有 Db 值的列表

转载 作者:行者123 更新时间:2023-11-30 23:40:17 28 4
gpt4 key购买 nike

我对 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}]}

正如您所看到的最后一条粗体记录,所有值都被删除并用最后一条记录填充。为什么会发生这种情况?追加应该追加而不是删除它,不是吗?

最佳答案

sctStatus 的引用始终是对相同字典的引用 - 当您附加该字典到sctResponse时code> 列表中,您不是附加字典的副本,而是附加引用。将最后一行更改为 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对于这种行为的另一个很好的解释。

关于Python:附加带有 Db 值的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12738111/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com