针对首个元素的不必要的可迭代对象分配 (RUF015)
修复总是可用的。
作用
检查以下构造,所有这些构造都可以用 next(iter(...))
替换
list(...)[0]
tuple(...)[0]
list(i for i in ...)[0]
[i for i in ...][0]
list(...).pop(0)
为什么这不好?
调用例如 list(...)
将创建一个包含整个集合的新列表,这对于大型集合来说可能非常昂贵。如果您只需要集合的第一个元素,则可以使用 next(...)
或 next(iter(...)
来惰性地获取第一个元素。其他构造也是如此。
示例
建议改为
修复安全性
此规则的修复被标记为不安全,因为从(例如)list(...)[0]
迁移到 next(iter(...))
可能会以两种方式更改程序的行为
- 首先,上述所有构造都将急切地评估整个集合,而
next(iter(...))
将只评估第一个元素。因此,在迭代过程中发生的任何副作用都将被延迟。 - 其次,通过方括号表示法
[0]
或pop()
函数访问集合的成员,如果集合为空,将引发IndexError
,而next(iter(...))
将引发StopIteration
。