2013-11-03 41 views
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

然而,如果我改變計數的順序+ = 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正確的計數。在任何兩個殼體的,我得到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,9999999,'invalid')。

第一個代碼中的計數有什麼問題?

回答

1

你應該追加之前複製您的列表:如果你改變「國家」別的,比如國家,FOO或XYZZY

import copy 

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

cacheList = [] 

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

好奇......

,它的工作原理和你不要在cacheList中獲得「無效」字段。

它看起來「狀態」是枚舉內某處的關鍵字或命名參數,並且有些事情被破壞。不知道這是否有幫助。

哈努哈利

0

在代碼中,您將追加8時相同的高速緩存,包含相同的緩存行。你的cacheList最終包含了一堆對同一個objet的引用:兩個元組列表

所以你第一次調用cacheList[cacheI][clI][bI] = (valid, address,'invalid')時,你修改了這個公共對象。計數= 1,現在每個高速緩存行是:

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

第二時間之後,計數= 2和高速緩存行是:

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

您innerloop的第一完成後,每一個「狀態」已變成「無效」。因此,您的計數停在2.

該解決方案的確使用copy模塊,因爲它將創建新對象,而不僅僅是傳遞引用。

相關問題