2016-02-05 86 views
9

我无意中写道:的= + Python的运算符语法正确

total_acc =+ accuracy 

代替:

total_acc += accuracy 

我搜索网,但没有找到anything。那么发生了什么,为什么Python认为我的意思是我正在输入?

电脑相信我们太多。 :)

+2

'total_acc = +准确性'是'total_acc = +准确性' – Clodion

+0

哦,所以当你想要负值时,你不要做*( - 1),谢谢@Clodion!不知道。 – gsamaras

+3

[关于在Python3中使用空格与一元运算符的逻辑]的可能重复(http://stackoverflow.com/questions/35208351/logic-regarding-the-use-of-spaces-with-unary-operators-in- python3) – zondo

回答

5

这是一样的,如果你像total_acc = -accuracy那样做,除了正面而不是负面。它基本上与total_acc = accuracy相同,因为在值之前添加+并不会改变它。

这就是所谓的元运算符因为只有一个参数(例如:+a),而不是两个(例如:a+b)。

This link解释它多一点。

2

它认为你在做total_acc = +accuracy,它设置total_acc等于accuracy+之前没有其他值的变量导致变量的__pos__方法被调用。对于大多数类型,这是一个nop,但有某些类型,例如Decimal,实施__pos__

+0

是的,这是正确的,但是'+'运算符会发生什么? – gsamaras

+3

'+'在值调用对象的'__pos __()'方法之前,如果它有一个。大多数类型没有这样的方法,所以它是没有操作的。 Decimal是一种使用它的类型; https://stackoverflow.com/questions/16819023/whats-the-purpose-of-the-pos-unary-operator-in-python – kindall

+0

@ kindall嗯,我不知道。很高兴知道,谢谢!我会将其添加到我的答案中。 –

7

如果您有兴趣尽早发现此类错误,可以使用静态代码分析来完成此操作。例如,flake8

$ cat test.py 
total_acc = 0 
accuracy = 10 

total_acc =+ accuracy 
$ flake8 test.py 
test.py:4:12: E225 missing whitespace around operator 

在这种情况下,抱怨+后的额外空间,以为你实际上意味着total_acc = +accuracy。这会帮助你更早地发现问题。

FYI,pylint也可以捕捉到。

+2

你的答案增加了*真正*这里特别的东西,你应该得到upvote²! – gsamaras