赋值语句的值
大家都知道,在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 个回答
在编程中,有时候我们需要处理一些数据,比如从一个地方获取数据,然后在另一个地方使用这些数据。这个过程就像是把水从一个水桶倒到另一个水桶里。
有些时候,我们会遇到一些问题,比如数据的格式不对,或者数据不完整。这就像是水桶里有个洞,水会漏掉,导致我们最后得到的水比预期的少。
为了避免这些问题,我们可以使用一些工具和方法来检查和处理数据,确保它们在转移的过程中不会出错。这样,我们就能顺利地把数据从一个地方搬到另一个地方,而不会丢失任何重要的信息。
总之,处理数据就像是搬运水,确保每一步都小心谨慎,这样才能保证最终得到的结果是我们想要的。
a = b = c = 2
b = 3
print a,b,c
>>> 2 3 2
另一个很好的例子:
>>a,b,c = b = 1,2,3
>>b
(1, 2, 3)
语法上就很明显:
assignment_stmt ::= (target_list "=")+ (expression_list | yield_expression)
在(target_list "=")+
的末尾有个小小的+
,这表示“一个或多个”。所以这一行a = b = c = 2
并不是三个赋值语句,而是一个赋值语句,里面有三个目标列表。
每个目标列表实际上只包含一个目标(在这里是一个标识符)。
文本中也提到过(我强调的部分):
一个赋值语句[...] 将单一的结果对象从左到右赋值给每个目标列表。
这可能会产生有趣的结果:
>>> (a,b) = c = (1,2)
>>> (a, b, c)
(1, 2, (1, 2))