Python:用Db值附加列表

2024-04-20 06:16:14 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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


Tags: getifstatus记录item基础知识陌生statusoption
2条回答

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

    sctStatus = {}
    sctStatus["nameStatus"] = theNameStatus
    sctStatus["IDstatus"] = item[0]
    sctStatus["cntStatus"] = item[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是pass-by-name——除非处理原语值,否则几乎总是按值传递这些伪指针。当您将sctStatus附加到列表时,您将附加一个名称,它仍然指向内存中的同一个sctStatus字典。当你修改字典的时候,所有指向它的名字现在都会调出changed字典。你知道吗

另请参见Other Languages have variables,以获得对这种行为的另一个很好的解释。你知道吗

相关问题 更多 >