赋值语句的值

16 投票
3 回答
1323 浏览
提问于 2025-04-16 23:17

大家都知道,在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 个回答

-1

在编程中,有时候我们需要处理一些数据,比如从一个地方获取数据,然后在另一个地方使用这些数据。这个过程就像是把水从一个水桶倒到另一个水桶里。

有些时候,我们会遇到一些问题,比如数据的格式不对,或者数据不完整。这就像是水桶里有个洞,水会漏掉,导致我们最后得到的水比预期的少。

为了避免这些问题,我们可以使用一些工具和方法来检查和处理数据,确保它们在转移的过程中不会出错。这样,我们就能顺利地把数据从一个地方搬到另一个地方,而不会丢失任何重要的信息。

总之,处理数据就像是搬运水,确保每一步都小心谨慎,这样才能保证最终得到的结果是我们想要的。

a = b = c = 2
b = 3
print a,b,c
>>> 2 3 2
0

另一个很好的例子:

>>a,b,c  = b = 1,2,3
>>b
(1, 2, 3)
24

语法上就很明显:

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))

撰写回答