赋值语句值

jbo*_*chi 16 python variable-assignment

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

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

>>> if a == b:
...     pass
...
Run Code Online (Sandbox Code Playgroud)

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

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

>>> a = (b = 2)
  File "<stdin>", line 1
    a = (b = 2)
           ^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

所以,我的问题是:为什么a = b = 2在Python中工作,因为它适用于赋值语句有值的其他语言,比如C?

>>> a = b = c = 2
>>> a, b, c
(2, 2, 2)
Run Code Online (Sandbox Code Playgroud)

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

Joa*_*uer 24

它就在语法中:

assignment_stmt ::=  (target_list "=")+ (expression_list | yield_expression)
Run Code Online (Sandbox Code Playgroud)

这种微小+在年底(target_list "=")+的意思是"一个或多个".因此,该行a = b = c = 2不包含3个赋值语句,而是包含3个目标列表的单个赋值语句.

每个目标列表又由一个目标组成(在这种情况下是一个标识符).

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

赋值语句[...] 从左到右将单个结果对象分配给每个目标列表.

这可以带来有趣的结果:

>>> (a,b) = c = (1,2)
>>> (a, b, c)
(1, 2, (1, 2))
Run Code Online (Sandbox Code Playgroud)