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)