我正在尝试执行与以下代码类似的操作,添加一个带有索引的列表作为字典的键。
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值也被删除,我在这里做错了吗?
答案 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()
或值之后它保持不变,则您知道它是参考值。