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
这将重新分配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)
链接地址: http://www.djcxy.com/p/10127.html
上一篇: Behaviour of increment and decrement operators in Python
