赋值语句值

时间:2011-08-10 14:46:46

标签: 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

3 个答案:

答案 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