为何两段逻辑相似的Python代码一段正常一段触发TypeError?
问题解惑:循环中
set.intersection报错的原因与解决方法 问题重现
第一段代码(注释掉循环)可正常运行:
import numpy as np MC = 100_000 N, P = 107, 14 rpp = 15 # Roles per person R = 2 # The correct role boxes = np.arange(N) len_interstct_1try = [] # for _ in range(MC): split_roles = [set(np.random.choice(boxes, size=rpp, replace=False)) for _ in range(P)] intrsctn = set.intersection(*[r for r in split_roles if R in r]) len_interstct_1try.append(len(intrsctn))
但添加for循环后,运行时触发如下错误:
len_interstct_1try = [] for _ in range(MC): split_roles = [set(np.random.choice(boxes, size=rpp, replace=False)) for _ in range(P)] intrsctn = set.intersection(*[r for r in split_roles if R in r]) len_interstct_1try.append(len(intrsctn))
错误信息:
File "<ipython-input-46-49ef6704b64c>", line 4, in <module> intrsctn = set.intersection(*[r for r in split_roles if R in r]) TypeError: unbound method set.intersection() needs an argument
报错原因
核心问题是筛选后的集合列表可能为空:
- 第一段代码只运行一次,碰巧
[r for r in split_roles if R in r]这个列表里至少有一个集合,set.intersection能正常接收参数执行。 - 循环跑10万次时,必然会出现某次随机生成的
split_roles里没有任何集合包含R的情况,此时筛选后的列表是空的,set.intersection(*[])相当于没有传入任何参数,而set.intersection作为类方法,必须至少传入一个集合实例才能执行,因此触发TypeError。
解决方法
只需要先判断筛选后的列表是否为空,为空时直接返回空集合即可:
len_interstct_1try = [] for _ in range(MC): split_roles = [set(np.random.choice(boxes, size=rpp, replace=False)) for _ in range(P)] filtered_roles = [r for r in split_roles if R in r] # 处理空列表的情况 if filtered_roles: intrsctn = set.intersection(*filtered_roles) else: intrsctn = set() len_interstct_1try.append(len(intrsctn))
或者用更简洁的三元表达式写法:
len_interstct_1try = [] for _ in range(MC): split_roles = [set(np.random.choice(boxes, size=rpp, replace=False)) for _ in range(P)] filtered_roles = [r for r in split_roles if R in r] intrsctn = set.intersection(*filtered_roles) if filtered_roles else set() len_interstct_1try.append(len(intrsctn))
内容的提问来源于stack exchange,提问作者semola
相关产品推荐
相关产品推荐

