【问题标题】:Python Assignment Operator Precedence - (a, b) = a[b] = {}, 5Python 赋值运算符优先级 - (a, b) = a[b] = {}, 5
【发布时间】:2015-11-14 15:58:59
【问题描述】:

我在Twitter 上看到了这个 Python sn-p,对输出感到很困惑:

>>> a, b = a[b] = {}, 5
>>> a
{5: ({...}, 5)}

这是怎么回事?

【问题讨论】:

    标签: python variable-assignment


    【解决方案1】:

    来自Assignment statements documentation

    赋值语句计算表达式列表(请记住,这可以是单个表达式或逗号分隔的列表,后者产生一个元组)并将单个结果对象从左到右分配给每个目标列表。

    您有两个分配目标列表; a, ba[b],值{}, 5从左到右分配给这两个目标。

    首先将{}, 5 元组解压缩为a, b。您现在拥有a = {}b = 5。请注意,{} 是可变的。

    接下来您将相同的字典和整数分配给a[b],其中a 计算为字典,b 计算为5,因此您将字典中的键5 设置为元组({}, 5) 创建循环引用。因此,{...} 引用了 a 已经引用的同一对象。

    由于分配是从左到右进行的,因此您可以将其分解为:

    a, b = {}, 5
    a[b] = a, b
    

    所以a[b][0]a 是同一个对象:

    >>> a, b = {}, 5
    >>> a[b] = a, b
    >>> a
    {5: ({...}, 5)}
    >>> a[b][0] is a
    True
    

    【讨论】:

    • 嗯,这对 Python 来说太不直观了!我希望它从右到左级联,从而抛出一个NameErrora[b] = a, b = {}, 5 工作。
    • 优秀的答案。我在发布之前就知道发生了什么,并计划发布回复,但你回答得很好。另外,为a[b][0] is a 线路 +1。
    • 不错的答案!但是文档说单个结果对象分配给每个目标列表,从左到右,所以它不应该等同于a, b = {}, 5; a[b] = {}, 5吗?
    • @Claudio:该顺序仅适用于赋值是表达式并因此要返回结果的语言。这会强制执行从右到左的顺序。在 Python 中,赋值是一个语句,而是遵循自然的阅读顺序。
    • @孙庆尧:没错。将元组分配给该字典中的键,您创建了对自身的引用。
    猜你喜欢
    • 1970-01-01
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    • 2017-05-16
    • 2011-03-28
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    相关资源
    最近更新 更多