【问题标题】:Python assignment operator associativityPython赋值运算符关联性
【发布时间】:2011-10-12 09:43:56
【问题描述】:

考虑以下 Python3 程序:

a = [0, 0]  
i = 0  
a[i] = i = 1  
print(a, i)  

a = [0, 0]  
i = 0  
i = a[i] = 1  
print(a, i)  

我预计输出是:

[0, 1] 1
[1, 0] 1

但我得到了:

[1, 0] 1
[0, 1] 1

我的问题是:Python 语言规范中是否有任何关于赋值运算符的关联性的内容,或者上述示例的行为是否未定义?

我所能找到的只是表达式是从左到右评估的,除了在赋值的情况下首先评估 r 值,但这没有帮助。

【问题讨论】:

标签: python operators


【解决方案1】:

简答:代码定义明确;顺序是从左到右。

长答案:

首先,让我们正确理解术语。与其他一些语言不同,Python 中的赋值是一个语句,而不是一个运算符。这意味着您不能将赋值用作另一个表达式的一部分:例如,i = (j = 0) 不是有效的 Python 代码。

赋值语句被定义为明确允许多个赋值目标(在您的示例中,它们是ia[i])。每个目标都可以是一个列表,但我们先把它放在一边。

如果有多个赋值对象,则从左到右赋值。引用documentation

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

【讨论】:

    【解决方案2】:

    只是为了说清楚,因为我努力自己去理解这一点。声明:

    a = b = c = ... = E
    

    等价于

    a = E
    b = E
    c = E
    ...
    

    【讨论】:

      猜你喜欢
      • 2013-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-10
      • 2011-09-18
      • 1970-01-01
      相关资源
      最近更新 更多