为何使用赋值而非append会因子列表的引用复制产生不同结果?
Python中列表乘法与直接赋值的差异原因
先看你给出的示例代码和结果:
示例1:使用append修改子列表
a = [[]] * 3 a[1].append(7) print(a)
输出:[[7], [7], [7]]
示例2:直接给列表元素赋值
a = [[]] * 3 a[1] = 7 print(a)
输出:[[], 7, []]
两者差异的核心原因是操作本质完全不同:
- 当你写
a = [[]] * 3时,Python并没有创建3个独立的空列表,而是先生成1个空列表对象,再让新列表a的3个元素全部指向这个唯一的空列表。换句话说,a[0]、a[1]、a[2]都是同一个列表的“别名”。 - 执行
a[1].append(7)时,是通过a[1]这个引用去修改它指向的共享列表。因为三个元素都指向同一个列表,所以所有位置都会同步显示修改后的结果。 - 而执行
a[1] = 7时,是直接把a列表索引1的位置,替换成了一个全新的对象(整数7)。此时a[1]不再指向原来的共享列表,但a[0]和a[2]仍指向原空列表,所以只有索引1的位置变成了7,其他位置保持不变。
内容的提问来源于stack exchange,提问作者dadi007
相关产品推荐
相关产品推荐

