Skip to main content
 首页 » 编程设计

Python 字典未正确更新

2025年05月04日32shihaiming

mydict = {}         
bufferID = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]     
physicalAddrList1 = [9,8]     
physicalAddrList2 = [10,11]     
addressToIdMap = {} 
def Update_Dictionary(physicalAddrList,cmdId,opcode):  
    for address in physicalAddrList: 
         list = GetBufferId() 
         addressToIdMap[address] = list  
         mydict[cmdId,opcode] = addressToIdMap 
def GetBufferId(): 
    list = [] 
    list.append([bufferID.pop(),25]) 
    return list  
 
Update_Dictionary(physicalAddrList1,1,0x01)     
Update_Dictionary(physicalAddrList2,2,0x02)       
print mydict 

输出:

C:\Users\29213\Desktop> list4.py 
{(1, 1): {8: [[25, 25]], 9: [[26, 25]], 10: [[24, 25]], 11: [[23, 25]]}, (2, 2): {8: [[25, 25]], 9: [[26, 25]], 10: [[24, 25]], 11: [[23, 25]]}}     

即使两个函数调用都是使用不同的物理地址列表进行的,但两个字典键都具有所有 4 个物理地址。
理想的输出应该是:

{(1, 1): {8: [[25, 25]], 9: [[26, 25]]}, (2, 2):{10: [[24, 25]], 11: [[23, 25]]}} 

请您参考如下方法:

问题在于声明 addressToIdMap = {}。您在模块级别声明了它,因此在您第二次调用 Update_Dictionary 函数之前它不会被清除。

你需要把它移到 Update_Dictionary

def Update_Dictionary(physicalAddrList,cmdId,opcode):  
    addressToIdMap = {} 
    for address in physicalAddrList: 
         list = GetBufferId() 
         addressToIdMap[address] = list  
         mydict[cmdId,opcode] = addressToIdMap