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