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、 ' IDstatus':5}]}

最後の太字のレコードを見るとわかるように、すべての値が消去され、最後のレコードで埋められました。なぜそれが起こっているのですか?追加は、それを一掃するのではなく、追加する必要があります、いいえ?

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辞書は1つしかないように見え、その、、、およびキーと値のペアを変更し"namestatus"続け"IDstatus"ます"cntStatus"。挿入してみてくださいsctStatus = {}、すなわち

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

毎回新しい辞書を追加するようにします。

于 2012-10-05T01:02:30.067 に答える