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

Python哈希表初始化时列表乘法导致异常结果的原因咨询

为什么两种哈希表初始化方式结果不同?

嘿,这个坑我刚学Python的时候也踩过!其实核心原因是Python里可变对象的引用机制,咱们一步步说清楚:

先看问题出在哪:self.map = [[]] * 10

当你用[[]] * 10的时候,你并没有创建10个独立的空列表——你只是把同一个空列表的引用复制了10遍,放进了外层列表里。打个比方,就像你给10个抽屉配了同一把钥匙,不管你开哪个抽屉,其实都是打开同一个柜子。

所以当你调用add方法往某个“桶”里加元素时,你其实是在修改那个唯一的底层列表,自然所有桶都会显示这个元素——因为它们本来就是同一个东西!你可以用id()函数验证一下:

test = [[]] * 10
print([id(item) for item in test])  # 输出的10个id完全一样

再看正确的方式:self.map = [[] for _ in range(10)]

这种列表推导式的写法就不一样了——每次循环range(10),都会执行一次[],也就是创建一个全新的空列表。这10个列表是完全独立的对象,各自有自己的内存地址,修改其中一个不会影响其他的。同样用id()验证:

test = [[] for _ in range(10)]
print([id(item) for item in test])  # 输出的10个id各不相同

总结一下

Python里的可变对象(比如列表、字典、自定义类实例)都是按引用传递的。如果用*来复制包含可变对象的序列,复制的只是引用,不是对象本身。所以以后创建包含可变对象的列表时,一定要用列表推导式、循环逐个创建这类方式,避免踩这个坑~

内容的提问来源于stack exchange,提问作者Michael Gee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:12:22