Python列表操作为何res输出为[[2,3],[2,3]]而非预期[[1,4],[2,3]]
问题原因
核心问题出在Python的列表是可变引用类型,你追加到res中的始终是同一个列表对象a的内存引用,而非a在追加时刻的内容副本。
逐行对应代码的执行逻辑:
- 初始化空列表
a和res后,第一次给a追加1、4,此时a的内容是[1,4],执行res.append(a)时,并没有把[1,4]这个值复制一份存到res里,只是把a对应的内存地址存到了res的第一个位置。 - 调用
a.clear()会直接清空这个内存地址上存储的列表内容,此时res第一个元素指向的列表也同步变成空,之前存的[1,4]没有被独立保存,已经被清空操作覆盖了。 - 后续给
a追加2、3,修改的还是同一个内存地址的列表对象,此时再执行res.append(a),相当于res的第二个位置存的也是同一个a的内存地址。这时候res里两个元素指向的是完全相同的列表对象,所以打印出来两个位置都是[2,3]。 - 最后执行
a.clear()时,res里两个元素指向的列表会同步被清空。
修正方法
每次往res追加内容时,不要直接传入原列表a,而是传入a当前内容的独立副本,常用的副本生成方式有a.copy()、切片a[:]、list(a)三种,修正后的代码如下:
a = [] res = [] a.append(1) a.append(4) res.append(a.copy()) # 追加独立副本,和原a对象解绑 a.clear() a.append(2) a.append(3) res.append(a.copy()) # 追加第二次内容的独立副本 a.clear() print(res) # 执行输出为[[1, 4], [2, 3]],符合预期
内容的提问来源于stack exchange,提问作者Aniruddh
相关产品推荐
相关产品推荐

