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

Python从列表创建集合:set构造函数与大括号解包的对比

Python 创建集合:set() vs {*iterable} 的对比

适用场景

用 set() 构造函数的场景

  • 创建空集合:这是最关键的场景——{} 创建的是空字典,要得到空集合只能用 set()
  • 兼容老版本Python:{*iterable} 是Python 3.5才引入的语法(PEP 448),如果代码要跑在2.7或更早版本,必须用 set()
  • 明确表达转换意图:团队协作或者给新手看的代码,set(my_list) 的语义更直白,一眼就能懂是“把列表转成集合”
  • 处理复杂可迭代对象:比如直接传入生成器表达式 set(x*2 for x in range(10)),写法自然不生硬

用 {*iterable} 解包语法的场景

  • 快速合并多个可迭代对象:比如 {*list1, *tuple1, *set1},比 set(list1).union(tuple1, set1) 更简洁直观
  • 保持字面量风格统一:如果代码里已经在用集合推导 {x for x in ...} 或字典字面量,用 {*iter} 能让语法风格更一致
  • 追求代码简洁:简单的列表/元组转集合,{*my_list} 比 set(my_list) 少打几个字符,显得更紧凑

性能差异

  • 处理普通可迭代对象(列表、元组等)时,两者性能几乎完全一致,底层都是调用相同的集合初始化逻辑
  • 针对生成器表达式,set(gen_expr) 和 {*gen_expr} 的执行效率也没什么差别,只是集合推导 {x for x in gen_expr} 会略快一点点(不过这是另一种写法)
  • 极端大数据量下,两者的内存占用和执行时间差异可以忽略不计

可读性与风格

set() 的优势

  • 无歧义:不会和空字典 {} 或者集合推导混淆,新手也能快速理解
  • 语义清晰:“转换为集合”的意图非常明确,不需要额外思考语法含义

{*iterable} 的优势

  • 代码更紧凑:合并多个集合时写法更短,视觉上更简洁
  • 风格统一:在大量使用字面量的代码块中,和其他字面量语法搭配更和谐

其他注意点

  • {*iterable} 本质是集合字面量的解包语法,只能用于可迭代对象的解包,无法单独创建空集合
  • 如果需要对转换过程做额外处理(比如先过滤元素),用 set() 结合生成器表达式,或者直接用集合推导会更合适

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 01:35:23