为什么在Python中b=(a+=1)是无效语法?

4
如果我在Python中写下以下代码,为什么会出现语法错误?
a = 1
b = (a+=1)

我正在使用Python 2.7版本。

当我运行它时,会得到以下结果:

>>> a = 1
>>> b = (a +=1)
  File "<stdin>", line 1
    b = (a +=1)
        ^
SyntaxError: invalid syntax
>>>

这是有效的Python语法,您需要提供更多信息。对于投票下降,我们感到抱歉,欢迎来到Stackoverflow。 - Mizipzor
4个回答

7

不同于其他一些语言,在Python中,赋值(包括增量赋值,例如+=)不是一个表达式。这也会影响到像这样的东西:

(a=1) > 2

这在C语言和其他几种编程语言中是合法的。

通常给出的原因是它有助于防止以下一类bug:

if a = 1: # instead of ==
    pass
else:
    pass

由于赋值不是一个表达式,在Python中会出现语法错误。在等价的C代码中,这是一个微妙的错误,变量将被修改而不是检查,检查始终为真(在C中,如在Python中,非零整数始终为真),else块永远不会触发。

你仍然可以在Python中进行链式赋值,所以这个是有效的:

>>> a = 1 
>>> a = b = a+1
>>> a
2
>>> b
2

4
在Python中,a +=1是一个语句,你不能将语句赋值给变量。虽然在C、PHP等语言中这是有效的语法,但在Python中不行。
b = (a+=1)

一个等效的版本将是:
>>> a = 1
>>> a += 1
>>> b = a

这是否意味着Python在赋值之前不会评估语句?从C的角度来看似乎很奇怪,但我想这可以防止副作用的发生。 - Har
2
@user1932405 += 有副作用,但与 C 不同的是,在 Python 中没有返回值。因此,即使像 while(x = 1){..} 这样的语句在 Python 中也是无效的。 - Ashwini Chaudhary
3
你误解了。Guido 故意决定不允许在表达式中使用 import 语句和赋值语句,以避免出现 bug(例如 while (a=something()) 时本意是 while (a==something()))。这不是一个“实现细节”之类的东西,而是一种设计选择。 - Bakuriu

2

正如@Ashwini所述,a+=1是一个赋值语句,而不是一个值。你不能将其赋值给b或任何变量。你可能想要的是:

b = a+1

1

这里提供的所有答案都很好,我只想补充一点,你可以用一行表达式实现你想要的结果,但是以不同的方式编写:

b, a = a+1, a+1

这里你做的事情与之前几乎相同:将a增加1,并将a+1的值赋给b - 我说“几乎”是因为这里有两个求和而不是一个。

1
你可以用一次求和完成它 - a = b = a+1 可以实现,并且只会计算 a+1 一次。 - lvc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接