它主要是语法糖,但不适用于您列出的语句;相反,它相当于
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]
,则等价将不再成立。