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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 03:30:56