0

以下は私のコードです。リストが変更された回数を計算するつもりですが、カウントが間違っているようです。私のコードを以下に示します。

t=(0,999999,"state")

cachLine = []

for x in range(0,2):
    cachLine.append(t);

cache = []
for x in range(0,1):
    cache.append(cachLine)

cacheList = []

for x in range(0,8):
    cacheList.append(cache)

count=0

for cacheI,cache in enumerate(cacheList):
    for clI,cl in enumerate(cache):
        for bI,(valid, address, state) in enumerate(cl):

            if state =='state': 
                cacheList[cacheI][clI][bI] = (valid, address,'invalid')
                count +=1
print(count)

この場合、カウントは 2 ですが、これは予想どおりではありません。16 になるはずです。

ただし、 count+=1 の順序を変更すると

for cacheI,cache in enumerate(cacheList):
    for clI,cl in enumerate(cache):
        for bI,(valid, address, state) in enumerate(cl):
            count +=1    
            if state =='state': 
                cacheList[cacheI][clI][bI] = (valid, address,'invalid')

print(count)

16 という正しいカウントを取得します。2 つのケースのいずれでも、cacheList の出力を取得します。

[[[(0, 999999, 'invalid'), (0, 999999, 'invalid')]], [[(0, 999999, 'invalid'), (0, 999999, 'invalid')]], [[(0, 999999, 'invalid'), (0, 999999, 'invalid')]], [[(0, 999999, 'invalid'), (0, 999999, 'invalid')]], [[(0, 999999, 'invalid'), (0, 999999, 'invalid')]], [[(0, 999999, 'invalid'), (0, 999999, 'invalid')]], [[(0, 999999, 'invalid'), (0, 999999, 'invalid')]], [[(0, 999999, 'invalid'), (0, 999999, 'invalid')]]]

これは 16 個のタプル (0、999999、「無効」) です。

最初のコードのカウントの何が問題になっていますか?

4

3 に答える 3

0

コードでは、SAME キャッシュラインを含む SAME キャッシュの 8 倍を追加します。cacheList には、最終的に、まったく同じオブジェクトへの一連の参照が含まれています: 2 つのタプルのリスト

したがって、最初に を呼び出すときcacheList[cacheI][clI][bI] = (valid, address,'invalid')に、この共通オブジェクトを変更します。count = 1 で、各キャッシュラインは次のようになります。

[(0,999999,"state"), (0,999999,"invalid")]

2 回目以降、count = 2 でキャッシュラインは次のとおりです。

[(0,999999,"invalid"), (0,999999,"invalid")]

インナーループの最初の完了後、すべての「状態」が「無効」になりました。したがって、カウントは 2 で停止します。

解決策はcopy、参照を渡すだけでなく、新しいオブジェクトを作成するため、モジュールを使用することです。

于 2013-11-04T14:38:24.947 に答える