You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:33:29