Python解释器原理疑问:列表重新赋值后引用它的字典未同步更新
问题解答
- 这个行为是Python语言规范明确定义的,不属于解释器实现细节,且你提供的代码片段并没有产生循环引用,核心原因和Python的变量引用机制有关。
- 核心原理:Python中的变量是对象引用,而非存储对象的容器
你执行
lista = [1,2,3]时,实际是先在内存中创建了列表对象[1,2,3],再让lista这个变量指向该对象的内存地址;后续执行dict = {1: lista}时,字典键1对应的值存储的是指向这个已有列表对象的引用,而非和lista这个变量本身绑定。
- 重新赋值变量只会修改变量的指向,不会修改原对象
你后续执行
lista = [1, dict]时,是新创建了一个列表对象[1, dict],再把lista变量的指向从原来的老列表修改为新列表,老列表[1,2,3]本身没有发生任何改动,字典里存储的引用仍然指向老列表,自然不会同步更新。
- 如果你想要实现预期的同步更新效果,需要原地修改原列表对象而非重新给变量赋值,此时才会产生循环引用,示例代码如下:
lista = [1,2,3] # 注意:不建议用dict作为变量名,会覆盖Python内置的dict类型 my_dict = {1: lista} # 原地修改原列表,而非重新给lista赋值 lista.append(my_dict) print(lista) print(my_dict)
运行后会输出:
[1, 2, 3, {1: [...]}] {1: [1, 2, 3, {...}]}
输出中的...就是Python识别到循环引用后做的特殊处理。
内容的提问来源于stack exchange,提问作者jolulop
相关产品推荐
相关产品推荐

