You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python列表乘法创建类实例为何指向同一对象?求相关文档

列表乘法创建实例列表的重复引用问题

假设我们定义一个Python类A:

>>> class A:
...     pass
...

想要创建包含3个A类实例的列表,使用列表乘法语法:

>>> some_a = [A(),] * 3
>>> len(some_a)
3

从长度看确实得到了3个元素,但打印后发现列表里是同一实例的3个引用:

>>> repr(some_a)
'[<__main__.A object at 0x7fc6fec7e290>, <__main__.A object at 0x7fc6fec7e290>, <__main__.A object at 0x7fc6fec7e290>]'

问题

该行为的原因及设计逻辑是什么?同时请指出Python语言参考中列表乘法的相关文档位置。


行为原因

列表乘法[x] * n的执行逻辑是:先计算x的值(这里就是调用A()创建的单个实例),然后将这个同一个对象引用重复n次放入新列表中。它并不会对x进行n次求值,所以最终列表里的所有元素都是指向同一个对象的指针。

设计逻辑

  • 性能优先:对于不可变对象(如整数、字符串、元组),重复创建完全相同的对象会额外增加计算开销,列表乘法直接复用引用能保证操作的高效性,这也是最常见的使用场景。
  • 逻辑一致性:Python中所有序列类型(列表、元组、字符串)的乘法操作都遵循“复制引用而非复制对象”的规则,统一的行为降低了语言的学习和理解成本。
  • 意图明确性:如果需要创建多个独立实例,Python提供了列表推导式[A() for _ in range(3)]这种更清晰的写法,直接表达“多次创建新对象”的意图,避免语法歧义。

Python语言参考相关位置

在Python官方语言参考的序列类型章节里,「通用序列操作」小节明确说明:序列乘法s * n或n * s会创建新序列,原序列的元素会被重复n次。这里的“元素”指的是原序列中元素的引用,而非元素的副本。

内容的提问来源于stack exchange,提问作者Antoine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 08:40:25