【问题标题】:How operator '=' is really working in the expression a = [x,y,z] = "123"? [duplicate]运算符 '=' 如何在表达式 a = [x,y,z] = "123" 中真正起作用? [复制]
【发布时间】:2017-07-15 22:38:19
【问题描述】:

非常基本的问题,但我认为我缺少一些我想了解的背景。

假设我们有表达式:

# version 1
a = [x,y,z] = "123"

#version 2
[x,y,z] = "123"
a = [x,y,z]

我知道第一个版本是一个混乱的代码,但我想了解。我一直认为这段代码的结果是一样的。我错了。 第一个“a”的类型是一个字符串,第二个“a”的类型是一个列表。问题是为什么在第一种情况下最右边的值的类型传播到左边?

【问题讨论】:

  • 这与a = b = 1 没有太大区别。 a 和 b 都被分配了最右边的值
  • 当然我看到等效版本是:a = "123" [x,y,z] = "123" 但是为什么呢?
  • 好吧,这很有趣。似乎名称为 a 的变量有某种偏好。

标签: python


【解决方案1】:

与 C 不同,= 不是运算符,并且语句

a = [x,y,z] = "123"

不被解析为a = ([x,y,z] = "123")。它不会将[x,y,z] = "123" 赋值的结果赋值给a

Python中赋值语句的语法是

assignment_stmt ::=  (target_list "=")+ (starred_expression | yield_expression)

并且,如documentation 中所述,

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

"123" 分配给a[x,y,z],以a 开头。

【讨论】:

  • 但是:[x,y,z] = a = "123"(也打印“123”)呢?如果从左到右计算它会是 ["1","2","3"],对吧??
  • @AntonvBR:不。它会将"123" 分配给[x, y, z],然后将"123" 分配给a
  • 感谢您的澄清
  • @user2357112 你知道这个解决方案背后的理念是什么吗?为什么如此不同?在 C 中?
  • @pmoniq:虽然我可以提供许多论据来支持 Python 的赋值设计(例如,a = b = 4.5 最终会变成 assigning 4 to a in C even if a is a double,这真的很令人困惑,但我们不会想要中间赋值导致 Python 中奇怪的类型转换),其中很多只是奇怪的历史事故,而且有些设计我强烈反对。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-18
  • 1970-01-01
  • 2011-04-01
  • 2015-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多