跳到内容

mutable-fromkeys-value (RUF024)

有时提供修复。

作用

检查作为值参数传递给 dict.fromkeys 的可变对象。

为什么这不好?

dict.fromkeys 方法创建的字典中的所有值都指向所提供对象的相同实例。如果修改了该对象,则所有值都将被修改,这可能会导致意外行为。 例如,如果将空列表([])作为默认值提供,则字典中的所有值都将使用相同的列表;因此,附加到任何一个条目将附加到所有条目。

相反,使用推导式生成具有默认值的不同实例的字典。

示例

cities = dict.fromkeys(["UK", "Poland"], [])
cities["UK"].append("London")
cities["Poland"].append("Poznan")
print(cities)  # {'UK': ['London', 'Poznan'], 'Poland': ['London', 'Poznan']}

建议改为

cities = {country: [] for country in ["UK", "Poland"]}
cities["UK"].append("London")
cities["Poland"].append("Poznan")
print(cities)  # {'UK': ['London'], 'Poland': ['Poznan']}

修复安全性

此规则的修复被标记为不安全,因为该编辑将通过为字典中的每个值使用不同的对象,而不是共享的可变实例来更改程序的行为。 在某些情况下,程序可能依赖于先前的行为。

参考