5

有人可以解释为什么 Python 解释器(2.7.3)给出以下内容:

>>> 5 -+-+-+ 2

3

这有用吗,有什么目的?

4

4 回答 4

10

您可以dis在此处查看表达式的实际评估方式:

In [29]: def func():
   ....:     return 5 -+-+-+ 2
   ....: 

In [30]: import dis

In [31]: dis.dis(func)
  2           0 LOAD_CONST               1 (5)
              3 LOAD_CONST               2 (2)
              6 UNARY_POSITIVE      
              7 UNARY_NEGATIVE      
              8 UNARY_POSITIVE      
              9 UNARY_NEGATIVE      
             10 UNARY_POSITIVE      
             11 BINARY_SUBTRACT     
             12 RETURN_VALUE        

所以这个表达式等价于:

In [32]: 5 - (+(-(+(-(+(2))))))
Out[32]: 3
于 2013-04-08T23:23:59.400 回答
6

这等于

5 - (+(-(+(-(+2)))))

其中除第一个之外的所有 + 和 - 都是一元运算符。对于数字,+返回未更改的操作数。__pos__但是,可以使用您自己的类上的特殊方法来覆盖它的含义。

用数字来做这件事是没有用的,但如果你使用带有自定义__neg__和/或__pos__操作的类实例,它可能很有用(如果令人难以置信的混乱)。


您可以滥用它来获得类似 C 的预增量--++运算符。永远不要真的这样做。

class IncrementableInteger(object):
    def __init__(self, val=0):
        self.val = val
    def __pos__(self):
        class PlusOne:
            def __pos__(_self):
                self.val += 1
        return PlusOne()
    def __neg__(self):
        class MinusOne:
            def __neg__(_self):
                self.val -= 1
        return MinusOne()
    def __str__(self):
        return str(self.val)
    def __repr__(self):
        return repr(self.val)

例子:

>>> IncrementableInteger(4)
4
>>> v=_
>>> ++v
>>> v
5
于 2013-04-08T23:23:31.427 回答
3

除了混淆代码之外,我没有看到任何实用程序。

对此的评价是:

5 -+-+-+ 2 = 5 -(+(-(+(-(+ 2)))))
           = 5 -(+(-(+(- 2))))
           = 5 -(+(-(- 2)))
           = 5 -(+(+ 2))
           = 5 -(+ 2)
           = 5 - 2
           = 3
于 2013-04-08T23:26:03.793 回答
2

它是这样解释的:

5 - (+(-(+(-(+2)))))

你可以写-a得到否定的a。为了对称和“为什么不呢?” 您还可以使用加号前缀,例如+a.

添加多个符号并不是很有用,但它是允许的,可能是因为它恰好在语法中是合法的,没有人认为需要明确禁止它。

于 2013-04-08T23:26:28.677 回答