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

Python中[0]*10与列表推导式的执行逻辑及差异疑问

问题

执行以下两行代码:

vis1 = [0 for i in range(10)]
vis2 = [0] * 10

得到的结果均为:

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

而执行name = "ram" * 10时,会将字符串"ram"重复10次得到"ramramramramramramramramramram"。为何[0]*10未按类似逻辑生成10个包含0的列表?此外,请解释第一行代码vis1 = [0 for i in range(10)]的执行过程,是否是通过循环生成10个0存入列表?

解答

为什么[0]*10不是10个包含0的列表?

Python里的乘法逻辑完全由操作对象的类型决定:

  • 字符串是不可变类型,"ram"*10会直接创建10个独立的"ram"片段,拼接成新的长字符串,这就是你看到的结果。
  • 而[0]*10中的0是整数,同样属于不可变类型。这里的乘法是生成一个列表,里面包含10个指向0这个整数对象的引用。因为整数不可变,最终呈现的就是10个0的列表——你之所以有误解,大概率是混淆了元素为可变对象的情况,比如[[0]]*10,这时候会生成10个指向同一个子列表[0]的引用,看起来像10个包含0的列表,但本质是同一个列表的多次引用。但[0]*10的元素是单个整数0,所以结果就是10个0的列表,逻辑完全自洽。

列表推导式[0 for i in range(10)]的执行过程

没错,这行代码就是通过循环生成10个0存入列表,具体步骤:

  1. 遍历range(10)生成的0到9的整数序列;
  2. 每次循环都会生成一个0(因为整数不可变,实际会复用同一个0对象,但逻辑上是循环生成10次);
  3. 把每次的0依次添加到新列表中,最终得到包含10个0的列表。

它等价于下面的普通循环代码:

vis1 = []
for i in range(10):
    vis1.append(0)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 14:01:04