商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > 如何在Python中快速创建全零或特定值的列表_使用乘法运算符[0] * n

如何在Python中快速创建全零或特定值的列表_使用乘法运算符[0] * n

  发布于2026-07-08 阅读(0)

扫一扫,手机访问

先说结论:用 [0] * n 来快速生成全零列表,既简洁又高效,但这招有个明确的适用范围——只适合那些不可变类型的元素。如果你想装可变对象,比如空列表 [] 或字典 {},那就要当心了,共享引用会带来连锁反应。

如何在Python中快速创建全零或特定值的列表_使用乘法运算符[0] * n

用乘法运算符创建全零列表,为什么快?

Python 的列表乘法在底层做了大量优化,它不会一个一个地调用构造函数,而是直接复制已有元素的引用,并一口气分配连续内存。对于 intstrNone 这类不可变对象,这种方式安全又高效。

  • 时间复杂度接近 O(1) 分配加上 O(n) 初始化,实际跑起来快得惊人;
  • 比起 [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。别等到调试半天才发现三个索引改的是同一个对象,那就太晚了。

本文转载于:https://www.php.cn/faq/2422131.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注