Python嵌套列表创建疑问:为何[[]]*3生成多个外层列表元素?
Python嵌套列表乘法的行为解析
两个表达式的运行逻辑
[[]] * 3
先构造外层列表[[]](内部包含一个空列表对象),然后对这个外层列表执行乘法操作。Python列表乘法的作用是重复列表内的元素引用,所以这里会把外层列表里的空列表引用复制3次,最终生成包含三个空列表引用的外层列表,即[[], [], []]。注意:这三个空列表指向同一个内存对象,修改其中一个会同步影响另外两个,这也是不推荐用这种方式创建独立嵌套列表的原因。
[[] * 3]
运算顺序是先执行内层的[] * 3:空列表乘以任意正整数,结果都是空列表(重复空元素多次依然是空),再将这个结果作为唯一元素放入外层列表,最终得到[[]]。
关于“反直觉”的说明
Python的表达式逻辑是统一的,之所以觉得这个行为特殊,是因为对列表乘法的本质理解不到位:列表乘法复制的是元素的引用,而不是创建全新的独立对象。当我们想要多个独立的空列表时,直觉上会预期乘法生成新对象,但实际上它只是重复了同一个对象的引用,这就造成了“不符合直觉”的感受。只要明确这一点,这个行为就完全符合Python的运算规则。
内容的提问来源于stack exchange,提问作者Natacha
相关产品推荐
相关产品推荐

