我注意到预增/减运算符可以应用于变量(如++count
)。它会编译,但实际上不会更改变量的值!
Python中的预增/减运算符(++/--)的行为是什么?
为什么Python与C/C++中看到的这些运算符的行为不同?
发布于 2009-09-28 07:39:36
++
不是运算符。它是两个+
运算符。+
运算符是identity运算符,它不执行任何操作。(澄清:+
和-
一元运算符仅适用于数字,但我假设您不会期望假设的++
运算符适用于字符串。)
++count
解析为
+(+count)
这可以翻译为
count
您必须使用稍微长一点的+=
运算符来执行您想要执行的操作:
count += 1
我怀疑为了保持一致性和简单性,++
和--
操作符被省略了。我不知道Guido van Rossum对这个决定的确切论点,但我可以想象一些论点:
++count
是模棱两可的,因为它可以是+
,+
,count
(两个一元+
运算符),就像解析++
,count
(一个一元++
运算符)一样容易。这不是一个重要的句法歧义,但它确实是exist.++
只不过是+= 1
的同义词。它是一种速记,因为C编译器很愚蠢,不知道如何将a += 1
优化为大多数计算机所具有的inc
指令。在这个优化编译器和字节码解释语言的时代,向一种语言添加操作符以允许程序员优化其代码通常是不受欢迎的,特别是在像Python语言这样被设计为具有一致性和readable.++
喜欢消除语言中的"gotcha"-s。pre-/post-increment in C的precedence issues非常复杂,而且非常容易搞砸。发布于 2009-09-28 09:05:01
Python没有前增量和后增量运算符。
在Python语言中,整数是不可变的。那就是你不能改变它们。这是因为整数对象可以在多个名称下使用。试试这个:
>>> b = 5
>>> a = 5
>>> id(a)
162334512
>>> id(b)
162334512
>>> a is b
True
上面的a和b实际上是同一个对象。如果你增加了a,你也会增加b,这不是你想要的。所以你必须重新分配。如下所示:
b = b + 1
许多使用python的C程序员想要一个增量运算符,但该运算符看起来像是递增对象,而实际上是重新分配对象。因此添加了-=
和+=
运算符,比b = b + 1
更短,同时比b++
更清晰和灵活,所以大多数人会递增:
b += 1
这会将b
重新分配给b+1
。这不是递增运算符,因为它不会递增b
,而是重新分配它。
简而言之: Python在这里的行为不同,因为它不是C语言,也不是机器代码的低级包装器,而是一种高级动态语言,在这种语言中,增量没有意义,而且也不像C那样必要,例如,在C中,每次有循环时都会使用增量。
发布于 2012-06-26 22:59:34
虽然其他答案是正确的,因为它们显示了纯粹的+
通常所做的事情(即,如果是1,则保留数字原样),但由于它们没有解释发生了什么,所以它们是不完整的。
准确地说,+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)
https://stackoverflow.com/questions/1485841
复制相似问题