Python中增量和减量运算符的行为

我注意到一个预增加/减少运算符可以应用于一个变量(如++count )。 它编译,但它实际上并没有改变变量的值!

Python中预增/减运算符(++ / - )的行为是什么?

为什么Python偏离了在C / C ++中看到的这些运算符的行为?


++不是一个操作符。 这是两个+运营商。 +运算符是身份运算符,它什么都不做。 (澄清: +-一元运算符只能用于数字,但我认为您不会期望假设的++运算符能够处理字符串。)

++count

解析为

+(+count)

转化为

count

您必须使用略长的+=运算符来执行您想要执行的操作:

count += 1

我怀疑++--操作符被遗漏了一致性和简单性。 我不知道Guido van Rossum给出这个决定的确切论点,但我可以想象一些论点:

  • 更简单的解析。 从技术上讲,解析++count是不明确的,因为它可能是++count (两个一元+运算符),就像它可能是++count (一个一元++运算符)一样容易。 这不是一个重要的句法歧义,但它确实存在。
  • 更简单的语言。 +++= 1的同义词。 这是一个简写,因为C编译器很愚蠢,不知道如何将大多数计算机的inc指令优化a += 1 。 在优化编译器和字节码解释语言的这一天,向语言添加运算符以允许程序员优化他们的代码通常是不受欢迎的,尤其是在像Python这样的语言中,这种语言被设计为一致可读。
  • 混淆的副作用。 在带有++运算符的语言中,一个常见的新手错误是将前后递归/递减运算符之间的差异(优先级和返回值)混合在一起,Python喜欢消除语言“gotcha”-s。 C中前/后增量的优先级问题非常多,并且非常容易混淆。

  • 当你想增加或减少时,你通常希望在一个整数上做到这一点。 像这样:

    b++
    

    但在Python中,整数是不可变的 。 那就是你不能改变它们。 这是因为整数对象可以使用几个名字。 尝试这个:

    >>> b = 5
    >>> a = 5
    >>> id(a)
    162334512
    >>> id(b)
    162334512
    >>> a is b
    True
    

    上面的a和b实际上是同一个对象。 如果你增加了a,你也会增加b。 这不是你想要的。 所以你必须重新分配。 喜欢这个:

    b = b + 1
    

    或者更简单:

    b += 1
    

    这将重新分配bb+1 。 这不是一个增量操作符,因为它不会增加b ,它会重新分配它。

    简而言之,Python在这里的行为不同,因为它不是C,并且不是围绕机器代码的低级包装,而是高级动态语言,其中增量没有意义,也不像C中那样必要,例如,每当你有一个循环时,你在哪里使用它们。


    当其他人在回答只要他们表现出什么区区正确+平常不同(即,保留该号码,因为它是,如果它是一个),他们是不完整的,只要他们没有解释发生了什么。

    准确地说, +x计算结果是x.__pos__()++xx.__pos__().__pos__()

    我可以想象一个非常奇怪的类结构(儿童,不要在家里这样做):

    class ValueKeeper(object):
        def __init__(self, value): self.value = value
        def __str__(self): return str(self.value)
    
    class A(ValueKeeper):
        def __pos__(self):
            print 'called A.__pos__'
            return B(self.value - 3)
    
    class B(ValueKeeper):
        def __pos__(self):
            print 'called B.__pos__'
            return A(self.value + 19)
    
    x = A(430)
    print x, type(x)
    print +x, type(+x)
    print ++x, type(++x)
    print +++x, type(+++x)
    
    链接地址: http://www.djcxy.com/p/10127.html

    上一篇: Behaviour of increment and decrement operators in Python

    下一篇: Frame Buster Buster ... buster code needed