Python多维列表赋值异常:为何所有子列表对应值均为5?
为什么Python多维列表赋值后所有元素都变成最后一个值?
这个坑我刚学Python的时候也踩过!问题出在你创建多维列表的方式上,咱们一步步拆解来看:
问题根源:*操作符复制的是引用而非新对象
你用的创建语句:
X = [[[None] * 4] * 2] * 6
这里的每一层*操作,对于**可变对象(比如列表)**来说,复制的不是新的列表实例,而是指向原列表的引用。具体来说:
- 首先
[None] * 4创建了一个包含4个None的列表,这步没问题,因为None是不可变对象; - 但
[[None]*4]*2并没有创建两个独立的长度为4的列表,而是创建了两个指向同一个列表的引用; - 最外层的
*6同理,是创建了6个指向同一个长度为2的列表的引用。
所以当你在循环里执行X[i][0][0] = i时,你每次修改的都是同一个底层的列表对象。循环到最后i=5时,这个底层列表的[0][0]被改成了5,而所有外层的列表引用指向的都是它,自然所有位置都显示为5。
正确的创建方式:用嵌套列表推导式
要创建真正独立的多维列表,应该用嵌套的列表推导式,每一层都生成新的列表实例:
X = [[[None for _ in range(4)] for _ in range(2)] for _ in range(6)] for i in range(0, 6): X[i][0][0] = i
这样每一层的列表都是全新的,修改其中一个不会影响其他的,运行后就能得到你预期的结果:每个外层列表的X[i][0][0]对应为i。
内容的提问来源于stack exchange,提问作者Edamame
相关产品推荐
相关产品推荐

