python - 赋值语句值

标签 python variable-assignment

每个人都知道在 Python 中赋值不返回值,大概是为了避免在 if 语句上赋值,而通常只是为了进行比较:

>>> if a = b:
  File "<stdin>", line 1
    if a = b:
         ^
SyntaxError: invalid syntax

>>> if a == b:
...     pass
...

出于同样的原因,人们可能会怀疑对同一语句的多次赋值也是语法错误。

事实上,a = (b = 2) 不是一个有效的表达式:

>>> a = (b = 2)
  File "<stdin>", line 1
    a = (b = 2)
           ^
SyntaxError: invalid syntax

所以,我的问题是:为什么 a = b = 2 在 Python 中工作,就像它在赋值语句具有值的其他语言(如 C)中工作一样?

>>> a = b = c = 2
>>> a, b, c
(2, 2, 2)

是否记录了此行为?我在赋值语句文档中找不到任何相关信息:http://docs.python.org/reference/simple_stmts.html#assignment-statements

最佳答案

它就在语法中:

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

(target_list "=")+ 末尾的小+ 表示“一个或多个”。因此 a = b = c = 2 行不包含 3 个赋值语句,而是由 单个赋值语句 和 3 个目标列表组成。

每个目标列表依次仅包含一个目标(在本例中为标识符)。

它也在文本中(强调我的):

An assignment statement [...] assigns the single resulting object to each of the target lists, from left to right.

这会导致有趣的结果:

>>> (a,b) = c = (1,2)
>>> (a, b, c)
(1, 2, (1, 2))

关于python - 赋值语句值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7012742/

相关文章:

python - TensorFlow 2.1 调用 cuInit : UNKNOWN ERROR (303) 失败

Python:组合列表的列表

javascript - Object.assign() 保留所有未更改的值

Java:条件初始化?

JavaScript:如何在表达式中多次获取和使用一个值

python - gunicorn 和 flask 以及 Nginx 的流媒体服务器问题

python - 是PyVISA安装失败吗?或者,我做错了什么吗?

python - pytorch模块中的初始化类成员

c# - 如何将另一个结构隐式转换为我的类型?

Python:如果不存在则赋值