如何创建Python嵌套列表中的独立子列表?解决引用同步修改问题
解决Python嵌套列表中子列表引用相同的问题
哦,这个坑我之前刚踩过!你遇到的问题本质是所有子列表其实都是同一个列表对象的引用,所以修改其中一个会同步影响所有子列表。
问题根源
当你写main_seat_list = [seats_in_row_list for i in range(rows)]时,并没有为每一行创建新的列表——你只是把seats_in_row_list这个列表的内存地址重复添加了rows次。因为列表是可变对象,所有子列表指向的都是同一个底层数据,自然改一个就全变了。
两种解决方法
方法1:为每个子列表创建副本
在列表推导式里,通过切片或者list()函数为原列表创建独立副本,这样每个子列表都是全新的对象:
import string seats = 4 # 用户可输入偶数,这里用4做示例 rows = 4 # 用户可输入偶数或奇数,这里用4做示例 seats_in_row_list = [i for i in string.ascii_uppercase[:seats]] # 用切片创建副本,或者替换成 list(seats_in_row_list) main_seat_list = [seats_in_row_list[:] for i in range(rows)]
方法2:直接在推导式中生成每个子列表
干脆跳过提前定义seats_in_row_list的步骤,直接在嵌套推导式里生成每一行的座位列表,这样每一行都是独立生成的:
import string seats = 4 rows = 4 main_seat_list = [[i for i in string.ascii_uppercase[:seats]] for _ in range(rows)]
测试效果
现在修改第一个子列表的元素:
main_seat_list[0][0] = 'X' print(main_seat_list)
输出完全符合你的预期:
[['X', 'B', 'C', 'D'], ['A', 'B', 'C', 'D'], ['A', 'B', 'C', 'D'], ['A', 'B', 'C', 'D']]
内容的提问来源于stack exchange,提问作者Sigurður Óskar Halldórsson
相关产品推荐
相关产品推荐

