Python中&和|仅适用于set类型,用于交集和并集运算;误用于list/tuple会报TypeError,需先用isinstance或set()转换。

用 & 和 | 做集合交集、并集,确实快且直观,但得先确认操作对象是 set
Python 中 & 和 | 对 set 类型有专门重载,分别对应交集和并集。但如果你误对 list 或 tuple 用这两个符号,会直接报 TypeError: unsupported operand type(s)。所以第一步永远是检查类型:isinstance(s, set) 或简单用 set() 转换。
- 交集:
a & b等价于a.intersection(b),返回新set,不修改原集合 - 并集:
a | b等价于a.union(b),同样返回新set - 多个集合一次运算:比如
a & b & c或a | b | c是合法的,按从左到右结合 - 注意空集合参与运算:空
set()与任何集合做交集得空集,做并集则结果等于另一方
为什么有时候 & 比 intersection() 更好,有时候反而要避开它
& 运算符要求**两个操作数都必须是 set 实例**;而 intersection() 方法可以接受任意可迭代对象(如 list、tuple、甚至字符串)作为参数:
-
{1, 2, 3} & [2, 3, 4]→ 报错 -
{1, 2, 3}.intersection([2, 3, 4])→ 返回{2, 3},没问题 - 如果数据来源不确定(比如来自 JSON 解析或用户输入),优先用
.intersection()+ 显式转换更安全 - 性能上,纯
set间用&略快(底层 C 实现优化),但差异在微秒级,除非高频调用否则不必纠结
别把 & 和 and、| 和 or 混了
这是新手最常踩的坑:and/or 是布尔逻辑运算符,作用于整个对象的真值,**不计算元素级交并**:
-
{1, 2} and {2, 3}返回{2, 3}(因为左边为真,返回右边对象本身) -
{1, 2} & {2, 3}才是真正的交集{2} - 同理,
{1} or {2}返回{1},不是并集 - 一旦写成
if a & b:,你是在判断交集是否非空;而if a and b:只是判断两者是否都非空——语义完全不同
实际用例中容易被忽略的细节:不可变性、重复元素与顺序
集合天然去重、无序,这点会影响结果的可读性和调试:
立即学习“Python免费学习笔记(深入)”;
- 交集/并集结果永远是新
set,原始集合不变 —— 如果你需要原地修改,得用&=或|=(例如a &= b相当于a.intersection_update(b)) - 如果输入含重复元素(比如
list转来的set),重复自动消失,这既是优点也是陷阱:你可能误以为数据“丢了” - 输出顺序不保证(尽管 CPython 当前实现下小整数集看起来有序,但这是实现细节,不能依赖);需要排序展示时,得额外套
sorted() - 含不可哈希元素(如
dict、list)的容器无法放入set,此时&/|会抛TypeError: unhashable type
set、list 还是刚从 API 拿回来的嵌套结构——多打一行 type(x) 或 print(x.__class__.__name__) 能省掉大半调试时间。


















