Python字典值在list.clear()之后被删除

时间:2018-10-21 08:05:20

标签: python dictionary

我正在尝试执行与以下代码类似的操作,添加一个带有索引的列表作为字典的键。

import random

rand_list = []
rand_dict = {}

for i in range(1, 10):
    for j in range(1, 3):
        rand_list.append(random.randint(1, 10))

    rand_dict.update({i: rand_list})
    rand_list.clear()

print(rand_dict)

我得到的输出

{1: [], 2: [], 3: [], 4: [], 5: [], 6: [], 7: [], 8: [], 9: []}

由于我不希望rand_list包含任何现有的生成数字,因此在将rand_list添加到rand_dict之后,我已经清除了rand_list中的内容。但是令人惊讶的是,rand_dict值也被删除,我在这里做错了吗?

1 个答案:

答案 0 :(得分:0)

import random

rand_list = []
rand_dict = {}

for i in range(1, 10):
    for j in range(1, 3):
        rand_list.append(random.randint(1, 10))

    rand_dict.update({i: rand_list.copy()})
    rand_list.clear()

print(rand_dict)

字典存储对 some 变量的引用,而不是实际值,因此clear()也会影响字典。 (如果我想进入理论领域,这就是您所说的可变变量。列表就是其中之一。而具有整数的变量将被复制而不是引用) < / p>

相反,请先擦拭副本,然后再擦拭。这样,对原始值的任何修改都不会影响字典。或重新考虑您的方法。

@deceze指出的另一种方法是一种更传统的解决方法,就是将列表创建放在循环中。

import random

rand_dict = {}

for i in range(1, 10):
    rand_list = []
    for j in range(1, 3):
        rand_list.append(random.randint(1, 10))

    rand_dict.update({i: rand_list.copy()})

print(rand_dict)

这样,每次迭代都是列表的新实例。本质上,与清除它的操作相同。我的用语也许不对,我比理论家更像是从业者/达人。

一个有用的工具是执行以下操作,以了解发生这种情况的原因以及最后一种方法起作用的原因:

for i in range(1, 10):
    rand_list = []
    print(hex(id(rand_list))) # <--

这将打印变量的内存地址。如果在字典中每个clear()或值之后它保持不变,则您知道它是参考值。