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
相关产品推荐
相关产品推荐

