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

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

我注意到可以对变量应用预增量/递减运算符(如++count)。它编译,但实际上并不改变变量的值!

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

为什么Python会偏离在C/C+中看到的这些操作符的行为?


浮云间
浏览 1125回答 3
3回答

侃侃无极

++不是操作员。是两个+操作员。这个+运算符是同一性接线员,什么都不做。(澄清:+和-一元运算符只对数字起作用,但我想你不会期望一个假设的++)操作符处理字符串。)++count解析为+(+count)翻译成count你得用稍微长一点的+=操作员来做您想做的事情:count += 1我怀疑++和--运算符由于一致性和简单性而被排除在外。我不知道Guido van Rossum给这个决定提供了确切的论据,但我可以想象一些论点:更简单的解析。从技术上讲,解析++count是模棱两可的,因为它可能是+, +, count(两元一元)+(操作人员)-尽可能容易++, count(一元)++(操作员)这不是一个显着的句法歧义,但它确实存在。更简单的语言。++只不过是同义词+= 1..这是一个速记发明,因为C编译器愚蠢,不知道如何优化a += 1进入inc大多数计算机都有指令。在优化编译器和字节码解释语言的今天,将运算符添加到允许程序员优化代码的语言中通常会遭到反对,特别是在Python这样的语言中,这种语言的设计是一致的和可读的。令人困惑的副作用。语言中的一个常见错误++运算符混淆了前后增量/递减运算符之间的差异(在优先级和返回值上),Python喜欢消除语言“gocha”-s。这个优先问题的C的前后增量毛茸茸的,而且很容易搞砸。

鸿蒙传说

当您想要增加或减少时,通常要在整数上这样做。就像这样:b++但在Python中,整数是不变..那就是你不能改变他们。这是因为整数对象可以在几个名称下使用。试试这个:>>> b = 5>>> a = 5>>> id(a)162334512>>> id(b)162334512>>> a is bTrue上面的A和b实际上是同一个对象。如果你增加a,你也会增加b,这不是你想要的。所以你得重新分配。就像这样:b = b + 1或更简单:b += 1重新分配b到b+1..这不是增量运算符,因为它不增量。b重新分配。简而言之:Python在这里的行为有所不同,因为它不是C,也不是机器代码的低级包装器,而是一种高级动态语言,在这种语言中,增量没有意义,而且也没有C中的那样必要,例如,每次有循环时都使用它们。

慕慕森

而其他的答案都是正确的,因为它们显示出+通常是这样的(也就是说,保留这个数字,如果它是一个),他们是不完整的,因为他们无法解释发生了什么。准确地说,+x评估为x.__pos__()和++x到x.__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)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python