从递归字典的解决方案中找到here ,我看到了以下 Python 配方:
class RecursiveDict(dict):
"""Implementation of perl's autovivification feature."""
def __missing__(self, key):
value = self[key] = type(self)()
return value
关于 value = self[key] = type(self)()
行:与下面的代码相比,它有什么优点或缺点吗?还是只是语法?
self[key] = type(self)()
value = self[key]
最佳答案
它主要是语法糖,但不是您列出的语句;相反,它等同于
value = type(self)()
self[key] = value
要查看差异,请在 Python 提示符下键入以下内容:
>>> class FakeDict(object):
... def __setitem__(self, k, v):
... pass
... def __getitem__(self, k):
... raise KeyError("boom!")
...
>>> d = FakeDict()
>>> x = d[1] = 42
>>> d[1] = 42
>>> x = d[1]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 5, in __getitem__
KeyError: boom!
当然,对于行为良好的dict
,这无关紧要,但是
self[key] = type(self)()
value = self[key]
确实会在第二行执行多余的 dict
查找,因此在循环内使用速记可能会带来性能优势。
在一般情况下,它比我上面说的还要复杂一点。速记赋值实际上等同于
__some_temporary = type(self)()
value = __some_temporary
self[key] = __some_temporary
和简化形式 value = type(self)(); self[key] = value
的出现只是因为 value
是一个简单的局部变量。如果 value
被替换为可能失败的 container[key]
形式的表达式,则等价性将不再成立。
关于Python - 具有多个(目标列表 "=")组的赋值语句有优点/缺点吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15123267/