关于在Python3中使用带有一元运算符的空格的逻辑

时间:2016-02-04 18:05:06

标签: python python-3.x

当我为for循环创建索引计数时出错时,我的问题就出现了,我在Python 3.4中发现了一个我不理解的行为。

> a = 1
> a =+ 2  #reversed 'plus and equal'
> a
2
> a += 2  #correct 'plus and equal'
> a
> a
4

起初我认为这个错误本应该返回一个错误,但我开始认为反转的“加号和平等”错误。逻辑可以被解释为变量' a'等于正整数' 2'。为了确认这一点,我尝试将变量设置为负整数,然后使用它来更改变量的符号。

> a =- 2
> a
-2
> a =- a
> a
2
> a = -a
> a
-2

这让我想知道为什么一元运算符不需要与正在改变的整数或变量相邻。

2 个答案:

答案 0 :(得分:5)

Python从右到左阅读,因为equals右侧的内容首先被解释,所以你有两个方面:

(a) =(+ 2) 

空格是自由空间,因此无论空格如何,解释器仍然会读取代码行,就像空白不存在一样。因此,Python将其解释为equals +2,因此,它就像使整数为正数(如果执行equals minus 2则为负数)

>>> a =+ 2 # note the whitespace
>>> a
>>> 2
>>> a = +2 # consistent interpretation
>>> a 
2
>>> a =- 2 # no matter where
>>> a
-2
>>> a = -2 # the whitespace is
>>> a
-2

这就像你在分配时不必在平等之间留出空间。 e.g:

a = 1

相同
a=1

解释器以适当的顺序读取它,并在解释信息时操纵信息。

答案 1 :(得分:0)

如果a =+ 2应该抛出错误,那么a = +2也应如此,因为Python允许a = 2a=2;它并不真正关心你放置空间的位置(只要你留意你的缩进)。

解释器和编译器在出现错误时会抛出错误,并且他们不知道您真正想要的是什么。在这种情况下,它非常清楚,因为行为已经明确定义(您只是将一个(冗余声明的)正整数分配给变量)。

口译员和编制者不应该问你“这真的是你想要的吗?”。另一个例子是if条件中的赋值,如if (line = readLine())。这肯定是错误发生的,但它仍然很清楚应该发生什么,许多开发人员正在使用这种方法来读取数据流。 (虽然有一种语言不允许在条件中进行分配,但不确定它是哪一种......)

虽然解释器和编译器不应该试图猜测这实际上是否是开发人员所犯的错误,但是静态代码分析的工具可以指出这样的东西,等等。

所以,回答你的问题(是否有任何理由反转+ =不应该返回错误):是的。因为这不是错误。

更新

正如评论中指出的那样,实际上Python不允许在条件中进行分配。

所以我正在修改我的答案:,我认为没有任何理由认为这不应该是错误。 当Python试图避免开发人员的错误时(这就是他们所说的in the docs“[...]它避免了C程序中遇到的常见问题类:在表达式中键入===被用作时。“,它也可以在您的情况下执行。