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存入列表,具体步骤:
- 遍历
range(10)生成的0到9的整数序列; - 每次循环都会生成一个
0(因为整数不可变,实际会复用同一个0对象,但逻辑上是循环生成10次); - 把每次的
0依次添加到新列表中,最终得到包含10个0的列表。
它等价于下面的普通循环代码:
vis1 = [] for i in range(10): vis1.append(0)
内容的提问来源于stack exchange,提问作者Yuvraj Parashar
相关产品推荐
相关产品推荐

