Python - 具有多个(目标列表 "=")组的赋值语句有优点/缺点吗?

标签 python

从递归字典的解决方案中找到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/

相关文章:

python - 如何在两个字符串之间进行模式匹配?

python - 如何通过另一个二维数组对 3D numpy 数组的每一行进行排序?

python - PEP 3106 建议更慢的方式?为什么?

python - 在数据框中混洗多列

python - 在同一个 Flask View 中处理 GET 和 POST

python - 如何在 python 中访问图像详细信息,即 GPS 数据和发光强度

python - 使用Python将子节点输出到CSV

python - Django 应用程序和 Django 内容类型之间有什么区别?

python - python 2.7 中的三元堆排序

python - 如何在python中获得逻辑正确的二进制移位