发布于2026-07-08 阅读(0)
扫一扫,手机访问
先说结论:用 [0] * n 来快速生成全零列表,既简洁又高效,但这招有个明确的适用范围——只适合那些不可变类型的元素。如果你想装可变对象,比如空列表 [] 或字典 {},那就要当心了,共享引用会带来连锁反应。
![如何在Python中快速创建全零或特定值的列表_使用乘法运算符[0] * n](/uploads/20260708/178348786392409.webp)
用乘法运算符创建全零列表,为什么快?
Python 的列表乘法在底层做了大量优化,它不会一个一个地调用构造函数,而是直接复制已有元素的引用,并一口气分配连续内存。对于 int、str、None 这类不可变对象,这种方式安全又高效。
[0 for _ in range(n)],少了循环语法解析和函数调用开销;list(numpy.zeros(n)),不用额外依赖,启动成本为零。但是要当心——千万别对可变对象用 [[]] * n
这是初学者最容易踩的坑。[[]] * 3 看上去生成了三个空列表,实际上这三个引用指向的是同一个对象。你修改其中一个,其他跟着一起变:
[[], [], []]# 执行 lst[0].append(1) 后:[[1], [1], [1]] # 而不是 [[1], [], []]
正确的姿势是改用列表推导式,确保每次调用都新建一个独立对象:
[[] for _ in range(n)] —— 每次 [] 都构造一个新列表;[{} for _ in range(n)]、[set() for _ in range(n)] 同理;[0] * n 安全,[None] * n 安全,[[]] * n 危险。创建特定值列表时,乘法 vs 列表推导式,怎么选?
如果你要的不是 0,而是 False、""、None 这类固定值,乘法仍然适用,但需要注意语义清晰性:
[False] * 10 ✅ 安全、高效,意图一目了然;[""] * 5 ✅ 字符串是不可变类型,没问题;[{"a": 0}] * 3 ❌ 错误!所有字典指向的是同一个对象;i**2,那就只能用推导式:[i**2 for i in range(n)]。真正的坑藏在嵌套结构里——哪怕你最初只是想填数字,但如果后续操作涉及往列表里塞列表或字典,从一开始就应该避开 * n。别等到调试半天才发现三个索引改的是同一个对象,那就太晚了。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8