每个人都知道在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
答案 0 :(得分:24)
语法中就是这样:
assignment_stmt ::= (target_list "=")+ (expression_list | yield_expression)
+
末尾的小(target_list "=")+
表示“一个或多个”。因此,行a = b = c = 2
不包含3个赋值语句,而是包含3个目标列表的单个赋值语句。
每个目标列表又由一个目标组成(在这种情况下是一个标识符)。
它也在文中(强调我的):
赋值语句[...]从左到右将单个结果对象分配给每个目标列表。
这可以带来有趣的结果:
>>> (a,b) = c = (1,2)
>>> (a, b, c)
(1, 2, (1, 2))
答案 1 :(得分:0)
另一个很好的例子:
>>a,b,c = b = 1,2,3
>>b
(1, 2, 3)
答案 2 :(得分:-1)
a = b = c = 2
b = 3
print a,b,c
>>> 2 3 2