Python字典值自动清空:循环内外打印结果不一致求助
问题分析与解决方案
嘿,我一眼就发现你代码里的问题啦!
问题根源
你在循环外部只创建了一个data_list列表对象,每次循环往这个列表里加数据后,把它的引用存到字典dictionary[i]里。当你最后调用data_list.clear()时,所有字典里的条目其实都指向同一个列表对象——清空这个列表,字典里的所有列表自然就都变成空的了。
至于循环内部打印字典正常,是因为那时候data_list还没被清空;等循环结束执行完clear(),所有引用这个列表的字典条目就都空了。
修复方案
有两种简单的修复方式:
方式1:每次循环新建一个列表
把data_list = []移到循环内部,这样每次迭代都会创建一个全新的列表,不会互相影响:
import sys def fill_dictionary_with_valid_addr_row_data(df): dictionary = {} int_endianness = 0 for i in df.index: data_list = [] # 移到循环内,每次新建独立列表 addrstr = str(df['Address'][i]) if (addrstr != 'nan'): try: addr = int(addrstr, 16) except: print("Address in excel is not in hex format : %s", addrstr) sys.exit() width = int(df['Width'][i]) width = int(width / 8); endianess = df['Endianess'][i] if (endianess != 'B') and (endianess != 'L'): print("ERROR: Register endianess is not B or L"); print("Register : %x, Endianess : %s" % (addr, endianess)) sys.exit() if endianess == 'B': int_endianness = 1 data_list.append(addr) data_list.append(width) data_list.append(int_endianness) dictionary[i] = data_list print(dictionary) # 无需再执行clear() print(dictionary) return dictionary
方式2:存储列表的副本
如果一定要复用列表,存到字典时要保存列表的副本,这样清空原列表不会影响字典里的内容:
import sys def fill_dictionary_with_valid_addr_row_data(df): data_list = [] dictionary = {} int_endianness = 0 for i in df.index: data_list.clear() # 清空复用的列表 addrstr = str(df['Address'][i]) if (addrstr != 'nan'): try: addr = int(addrstr, 16) except: print("Address in excel is not in hex format : %s", addrstr) sys.exit() width = int(df['Width'][i]) width = int(width / 8); endianess = df['Endianess'][i] if (endianess != 'B') and (endianess != 'L'): print("ERROR: Register endianess is not B or L"); print("Register : %x, Endianess : %s" % (addr, endianess)) sys.exit() if endianess == 'B': int_endianness = 1 data_list.append(addr) data_list.append(width) data_list.append(int_endianness) dictionary[i] = data_list.copy() # 存储列表副本而非引用 print(dictionary) print(dictionary) return dictionary
小提示
Python里的列表、字典都是可变对象,赋值时传递的是引用而非副本。如果不小心复用同一个可变对象,很容易出现这种“改一处全变”的问题,以后写代码可以多留意这点哦~
内容的提问来源于stack exchange,提问作者Jagdish
相关产品推荐
相关产品推荐

