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
相关产品推荐
相关产品推荐

