1

我在 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, ' ID状态':5}]}

正如您所看到的最后一条粗体记录,所有值都已清除,并用最后一条记录填充。为什么会这样?Append 应该追加而不是清除它,不是吗?

4

2 回答 2

2

引用sctStatus始终是对同一字典的引用 - 当您append将该字典添加到sctResponse列表时,您不是在附加字典的副本,而是对它的引用。每次将最后一行更改为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 是按名称传递的——除非您处理的是原始值,否则您几乎总是按值传递这些伪指针。当您附加sctStatus到列表时,您附加的名称仍指向sctStatus内存中的同一字典。当您更改该字典时,指向它的所有名称现在都会拉出更改后的字典。

另请参阅其他语言有变量以获得对这种行为的另一个很好的解释。

于 2012-10-05T01:02:34.680 回答
1

假设循环如您所展示的那样,那么在我看来只有一个sctStatus字典,并且您不断更改它的"namestatus","IDstatus""cntStatus"键值对。尝试插入sctStatus = {},即

    sctStatus = {}
    sctStatus["nameStatus"] = theNameStatus
    sctStatus["IDstatus"] = item[0]
    sctStatus["cntStatus"] = item[2]

这样您每次都附加一个新字典。

于 2012-10-05T01:02:30.067 回答