Python列表创建差异及字典引用修改问题咨询
案例1:列表创建方式的差异解析
先看执行的代码:
a = [[] for i in range(5)] b = [[]] * 5 a[3].append(3) b[3].append(3) print(a) # 输出: [[], [], [], [3], []] print(b) # 输出: [[3], [3], [3], [3], [3]]
两者的核心差异在于列表元素的独立性:
a = [[] for i in range(5)]是列表推导式,每一次循环都会新建一个独立的空列表,所以a里的5个元素是5个完全不同的列表对象。修改其中一个,其他不会受影响。b = [[]] * 5是将同一个空列表的引用重复了5次,b里的5个元素其实指向内存中同一个列表。不管修改b的哪个索引位置的元素,本质都是在修改那个唯一的列表,所以所有位置都会显示相同的内容。
案例2:可变对象的引用机制问题
执行的代码如下:
def test(sentences): root = {} for sentence in sentences: base = root for word in sentence.split(' '): if not base.get(word): base[word] = {} base = base[word] return root print(test(["Hello world", "Hello there"])) # 输出: {'Hello': {'world': {}, 'there': {}}}
原因很直接:Python里的字典是可变对象,base = root 并不是复制root的内容,而是让base和root指向内存中同一个字典对象。
当你通过base[word] = {} 修改字典内容时,本质是在修改这个共享的字典对象。虽然代码里没有直接写root[key] = ...,但base只是root的引用,对base的内容修改会直接作用到root指向的那个字典上,最终root自然会被修改。
内容的提问来源于stack exchange,提问作者Chandan Naik
相关产品推荐
相关产品推荐

