Python 自动删除所有键的字典值

Python 自动删除所有键的字典值,python,python-3.x,dictionary,Python,Python 3.x,Dictionary,代码 def fill_dictionary_with_valid_addr_row_data( df ): data_list = [] dictionary = {} int_endianness = 0 for i in df.index: addrstr = str(df['Address'][i]) if (addrstr != 'nan'):

代码

 def fill_dictionary_with_valid_addr_row_data( df ):

        data_list = []
        dictionary = {}
        int_endianness = 0

        for i in df.index:
            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)

                data_list.clear()

        print(dictionary)

        return dictionary
问题

当我为循环打印字典时,一切都很好。当我在for循环外部打印字典时,所有的值(列表)都是空的

下面是日志

{0:[22216704,4,1]}
{0: [22216716, 4, 1], 5: [22216716, 4, 1]}
{0: [22216720, 4, 1], 5: [22216720, 4, 1], 7: [22216720, 4, 1]}
{0: [], 5: [], 38: [], 7: []}
我是一名初级python程序员。我试图在互联网上搜索很多东西,但我没有找到任何解决办法


有什么线索吗?

每当您执行
dictionary[i]=data\u list
时,您实际上会将列表的引用分配给dictionary条目。考虑下面的例子:

>>> l = [1,2,3]
>>> d = {}
>>> d["a"] = l
>>> d["b"] = l
>>> d
{'a': [1, 2, 3], 'b': [1, 2, 3]}
>>> l.clear()
>>> d
{'a': [], 'b': []}
如您所见,对
l
的更改反映在所有字典值中。您每次在打印输出中看到的是分别分配给一个、两个或三个词典条目的相同列表。因为它总是相同的值,所以看起来好像每次都添加了不同的列表,但事实并非如此

实际上,您要做的是为每个循环迭代创建一个新列表:

for i in df.index:
    ...

    data_list = []
    data_list.append(addr)
    data_list.append(width)
    data_list.append(int_endianness)
    dictionary[i] = data_list
或更短:

dictionary[i] = [addr, width, int_endianness]

使用此代码,
data\u list
将在每次迭代中包含一个新列表,与以前定义的列表没有连接。

无论何时执行
dictionary[i]=data\u list
,您实际上都会将列表的引用分配给dictionary条目。考虑下面的例子:

>>> l = [1,2,3]
>>> d = {}
>>> d["a"] = l
>>> d["b"] = l
>>> d
{'a': [1, 2, 3], 'b': [1, 2, 3]}
>>> l.clear()
>>> d
{'a': [], 'b': []}
如您所见,对
l
的更改反映在所有字典值中。您每次在打印输出中看到的是分别分配给一个、两个或三个词典条目的相同列表。因为它总是相同的值,所以看起来好像每次都添加了不同的列表,但事实并非如此

实际上,您要做的是为每个循环迭代创建一个新列表:

for i in df.index:
    ...

    data_list = []
    data_list.append(addr)
    data_list.append(width)
    data_list.append(int_endianness)
    dictionary[i] = data_list
或更短:

dictionary[i] = [addr, width, int_endianness]

使用此代码
data\u list
将在每次迭代中包含一个新列表,与以前定义的列表没有连接。

因为您在循环中写入了data\u list.clear()。请提供一个最小的示例。尝试减少代码以重现问题。您确定上面代码的缩进与编辑器中的缩进完全相同吗?我认为代码与输出不匹配。@Pushplata您可以看到,即使我每次都清除列表,每次在for循环中字典都会正确打印。@HubertGrzeskowiak代码与我测试它时的代码完全相同。为什么您认为代码与输出不匹配?因为您在循环中编写了data_list.clear()。请提供一个最小的示例。尝试减少代码以重现问题。您确定上面代码的缩进与编辑器中的缩进完全相同吗?我认为代码与输出不匹配。@Pushplata您可以看到,即使我每次都清除列表,每次在for循环中字典都会正确打印。@HubertGrzeskowiak代码与我测试它时的代码完全相同。为什么您认为代码与输出不匹配?不管怎样,每次迭代都会清除数据列表,那么为什么在for循环中正确打印字典?@JagsVG,因为您首先填写共享列表,打印字典及其引用,然后清除列表。如果在将项目添加到列表之前或清除列表之后打印字典,您会注意到它会更改所有字典值。无论如何,每次迭代都会清除数据列表,那么为什么在for循环内部正确打印字典?@JagsVG,因为您首先填充共享列表,打印字典及其引用,然后清除列表。如果在将项目添加到列表之前或清除列表之后打印词典,您将注意到它会更改所有词典值。