Python预定义长度嵌套列表赋值后所有元素相同问题求解
问题成因说明
- Python中列表属于可变对象,使用
*运算符对包含可变对象的列表做重复操作时,实际重复复制的是可变对象的内存引用,而非创建新的独立对象。
你写的list_of_list = 4*[3*[0]]会分两步执行:
- 先执行
3*[0]生成一个子列表[0,0,0],记这个子列表的内存地址为A - 再执行
4*[地址A对应的列表],生成包含4个元素的外层列表,这4个元素全部都是指向地址A的引用
这就意味着你修改任意一个子列表的元素,本质都是修改地址A处的内容,所有子列表会同步变化,最终呈现的结果就是所有子列表都等于最后一次循环赋值的结果。
你注释掉的初始化循环可以解决问题的原因是:每次执行list_of_list[y] = [0, 0, 0]时,[0,0,0]都会新创建一个独立的子列表,把外层列表对应位置的引用替换成新子列表的地址,执行完4次循环后,外层列表的4个元素分别指向4个完全独立的子列表,后续修改就不会互相干扰,自然能得到预期结果。
如果要更简洁地初始化独立嵌套列表,可以直接用列表推导式规避引用重复问题:
list_of_list = [[0]*3 for _ in range(4)]
内容的提问来源于stack exchange,提问作者Eric Bluneau
相关产品推荐
相关产品推荐

