Python用列表乘数字创建二维列表修改元素异常是什么原因?
Python列表乘法运行机制及坑点说明
[2]*3的运行原理
Python中的序列 * 正整数语法,本质是将序列内的元素引用复制N次后拼接为新序列,不会对元素本身做深拷贝。
对于[2] * 3的场景:
- 列表中的元素是不可变的整数类型,乘法操作会把指向整数2的引用复制3次,最终得到
[2, 2, 2]的结果。 - 因为整数不可修改,后续你修改列表某个位置的元素时,只是把该位置的引用替换为其他值,不会影响其他位置的元素,因此这种用法不会出现异常。
二维数组创建时的问题原因
你使用[["O"]*7]*6创建二维列表时触发了浅拷贝的坑:
- 第一步
["O"] *7会先生成一个包含7个"O"的一维列表 - 第二步
*6操作是把上述一维列表的内存引用复制了6次,最终你得到的外层列表里的6个内层列表,本质是指向同一个内存地址的同一个对象,不是6个独立的列表。 - 因此你修改
exploded[0][0] = 9时,实际修改的是这个共享的内层列表的第一个元素,所有引用了该内层列表的行都会同步发生变化,就出现了修改一个元素整列都变的现象。
正确的二维列表创建方式
如果要生成独立的内层列表,使用列表推导式即可:
exploded = [["O"] *7 for _ in range(6)]
该写法每次循环都会生成全新的内层列表,修改任意元素不会影响其他行。
内容的提问来源于stack exchange,提问作者No Name
相关产品推荐
相关产品推荐

