Python中set.add()触发异常:条件外添加索引的问题排查
问题根源:
dict.fromkeys()的可变对象引用陷阱 你遇到的问题核心是**dict.fromkeys()的参数特性**:当你用dict.fromkeys(all_tokens, set())创建字典时,所有键对应的都是同一个集合对象,而不是每个键都拥有独立的集合。
因为set()是可变对象,fromkeys只会把这个对象的引用赋值给所有键。所以不管你操作哪个token对应的token_dict[token].add(i),本质上都是在修改同一个集合。这就导致所有token的集合最后都会包含所有索引,看起来像是条件判断失效了。
换成list时同理,所有键共享同一个列表,每次append都会往这个公共列表里加元素,自然会重复添加多次。
解决办法
把token_dict的创建方式换成字典推导式,这样每个键都会生成独立的新集合:
token_dict = {token: set() for token in all_tokens}
用这种方式创建的字典,每个token对应的都是全新的集合对象,操作各自的集合时不会互相干扰,条件判断if token in token_set:就能正常生效,只有符合条件的索引才会被添加到对应token的集合里。
内容的提问来源于stack exchange,提问作者DLS
相关产品推荐
相关产品推荐

