Python集合中&=运算符的作用及pycocotools代码示例解析
Python中set的
&=运算符含义解析 核心含义
&=是Python集合的交集更新运算符,它会直接修改原集合,将其更新为原集合与右侧集合的交集——也就是只保留两个集合中都存在的元素,等价于ids = ids & other_set(但&=是原地修改,效率更高)。
结合你的测试代码分析
你的测试代码中:
fruits = set(['apple', 'banana', 'cherry']) cars = set(['Ford', 'BMW', 'Volvo']) fruits &= cars print("fruits: len:{}, type: {}, values: {}".format( len(fruits), type(fruits), fruits ))
fruits和cars是两个完全没有交集的集合,它们的交集是空集合,所以执行fruits &= cars后,fruits被更新为空集合,这就是你得到len:0结果的原因。
结合pycocotools的getImgIds代码分析
这段代码的作用是筛选出**同时包含所有指定类别(catIds)**的图片ID,&=在这里的逻辑非常关键:
def getImgIds(self, imgIds=[], catIds=[]): ''' Get img ids that satisfy given filter conditions. :param imgIds (int array) : get imgs for given ids :param catIds (int array) : get imgs with all given cats :return: ids (int array) : integer array of img ids ''' imgIds = imgIds if _isArrayLike(imgIds) else [imgIds] catIds = catIds if _isArrayLike(catIds) else [catIds] if len(imgIds) == len(catIds) == 0: ids = self.imgs.keys() else: ids = set(imgIds) for i, catId in enumerate(catIds): if i == 0 and len(ids) == 0: ids = set(self.catToImgs[catId]) else: ids &= set(self.catToImgs[catId]) return list(ids)
- 初始时
ids是传入的图片ID集合(如果有传入imgIds) - 遍历每个类别ID:
- 若第一个类别且初始
ids为空,则直接把该类别对应的所有图片ID集合赋值给ids - 否则,用
&=取当前ids与该类别图片ID集合的交集,更新ids
- 若第一个类别且初始
- 每一次
&=操作都在缩小ids的范围,最终ids中的图片ID必然存在于所有指定的类别中,完美实现了“获取包含所有指定类别的图片ID”的需求。
内容的提问来源于stack exchange,提问作者stackbiz
相关产品推荐
相关产品推荐

