我如何使用预递增/递减操作符(++,——),就像在c++ ?

为什么++计数运行,但不改变变量的值?


当前回答

博士TL;

Python没有一元的递增/递减操作符(——/++)。相反,要增加一个值,请使用

a += 1

更多细节和陷阱

但这里要小心。如果你来自C语言,在python中甚至这一点都是不同的。Python没有C语言那样的“变量”,相反,Python使用名称和对象,并且在Python中int是不可变的。

假设你有

a = 1

这在python中意味着:创建一个int类型的值为1的对象,并将名称a绑定到它。对象是int的一个实例,值为1,名称a指向它。名称a和它所引用的对象是不同的。

现在让我们假设你知道

a += 1

由于int型是不可变的,这里发生的情况如下:

查找a所指向的对象(它是一个int型,id为0x559239eeb380) 查找对象0x559239eeb380的值(它是1) 将该值加1 (1 + 1 = 2) 创建一个值为2的新int对象(对象id为0x559239eeb3a0) 将名称a重新绑定到这个新对象 现在a引用对象0x559239eeb3a0,原始对象(0x559239eeb380)不再被名称a引用。如果没有任何其他名称引用原始对象,它将在以后被垃圾收集。

你自己试试吧:

a = 1
print(hex(id(a)))
a += 1
print(hex(id(a)))

其他回答

python中不像C语言中那样有后/前自增/自减操作符。

我们可以看到++或-作为多个符号相乘,就像我们在数学中做的(-1)*(-1)=(+1)。

E.g.

---count

解析为

-(-(-count)))

翻译过来就是

-(+count)

因为-号和-号的乘法是+

最后,

-count

虽然其他答案是正确的,因为它们表明了单纯的+通常做什么(即,保持数字的原样,如果它是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)

在python 3.8+中,你可以做:

(a:=a+1) #same as ++a (increment, then return new value)
(a:=a+1)-1 #same as a++ (return the incremented value -1) (useless)

你可以用这个做很多思考。

>>> a = 0
>>> while (a:=a+1) < 5:
    print(a)

    
1
2
3
4

或者如果你想写一些更复杂的语法(目标不是优化):

>>> del a
>>> while (a := (a if 'a' in locals() else 0) + 1) < 5:
    print(a)

    
1
2
3
4

即使'a'不存在也会返回0,然后将其设置为1

++不是运算符。它是两个+运算符。+运算符是单位运算符,它什么也不做。(澄清:+和-一元操作符仅适用于数字,但我假定您不会期望假设的++操作符适用于字符串。)

++count

解析为

+(+count)

翻译过来就是

count

你必须使用稍微长一点的+=运算符来做你想做的事情:

count += 1

我怀疑省略++和——操作符是为了保持一致性和简单性。我不知道Guido van Rossum为这个决定给出的确切理由,但我可以想象出一些理由:

Simpler parsing. Technically, parsing ++count is ambiguous, as it could be +, +, count (two unary + operators) just as easily as it could be ++, count (one unary ++ operator). It's not a significant syntactic ambiguity, but it does exist. Simpler language. ++ is nothing more than a synonym for += 1. It was a shorthand invented because C compilers were stupid and didn't know how to optimize a += 1 into the inc instruction most computers have. In this day of optimizing compilers and bytecode interpreted languages, adding operators to a language to allow programmers to optimize their code is usually frowned upon, especially in a language like Python that is designed to be consistent and readable. Confusing side-effects. One common newbie error in languages with ++ operators is mixing up the differences (both in precedence and in return value) between the pre- and post-increment/decrement operators, and Python likes to eliminate language "gotcha"-s. The precedence issues of pre-/post-increment in C are pretty hairy, and incredibly easy to mess up.

扩展Henry的回答,我实验性地实现了一个语法糖库,实现了++:hdytto。

使用方法简单。从PyPI安装后,放置sitecustomize.py:

from hdytto import register_hdytto
register_hdytto()

在项目目录中。然后,使main.py:

# coding: hdytto

a = 5
print(a++)
print(++a)
b = 10 - --a
print(b--)

并通过PYTHONPATH=运行它。python main.py。输出将是

5
7
4

在解码脚本文件时,Hdytto将++替换为((a:=a+1)-1),因此它可以工作。