首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python中增量和减量运算符的行为

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

Stack Overflow用户
提问于 2009-09-28 07:33:20
回答 10查看 1.3M关注 0票数 970

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

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

为什么Python与C/C++中看到的这些运算符的行为不同?

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2009-09-28 07:39:36

++不是运算符。它是两个+运算符。+运算符是identity运算符,它不执行任何操作。(澄清:+-一元运算符仅适用于数字,但我假设您不会期望假设的++运算符适用于字符串。)

代码语言:javascript
运行
复制
++count

解析为

代码语言:javascript
运行
复制
+(+count)

这可以翻译为

代码语言:javascript
运行
复制
count

您必须使用稍微长一点的+=运算符来执行您想要执行的操作:

代码语言:javascript
运行
复制
count += 1

我怀疑为了保持一致性和简单性,++--操作符被省略了。我不知道Guido van Rossum对这个决定的确切论点,但我可以想象一些论点:

  • 更简单的解析。从技术上讲,解析++count是模棱两可的,因为它可以是++count (两个一元+运算符),就像解析++count (一个一元++运算符)一样容易。这不是一个重要的句法歧义,但它确实是exist.
  • Simpler语言。++只不过是+= 1的同义词。它是一种速记,因为C编译器很愚蠢,不知道如何将a += 1优化为大多数计算机所具有的inc指令。在这个优化编译器和字节码解释语言的时代,向一种语言添加操作符以允许程序员优化其代码通常是不受欢迎的,特别是在像Python语言这样被设计为具有一致性和readable.
  • Confusing副作用的语言中。在使用Python运算符的语言中,一个常见的新手错误是混淆了前后递增/递减运算符之间的差异(在优先级和返回值方面),而++喜欢消除语言中的"gotcha"-s。pre-/post-increment in Cprecedence issues非常复杂,而且非常容易搞砸。
票数 1.3K
EN

Stack Overflow用户

发布于 2009-09-28 09:05:01

Python没有前增量和后增量运算符。

在Python语言中,整数是不可变的。那就是你不能改变它们。这是因为整数对象可以在多个名称下使用。试试这个:

代码语言:javascript
运行
复制
>>> b = 5
>>> a = 5
>>> id(a)
162334512
>>> id(b)
162334512
>>> a is b
True

上面的a和b实际上是同一个对象。如果你增加了a,你也会增加b,这不是你想要的。所以你必须重新分配。如下所示:

代码语言:javascript
运行
复制
b = b + 1

许多使用python的C程序员想要一个增量运算符,但该运算符看起来像是递增对象,而实际上是重新分配对象。因此添加了-=+=运算符,比b = b + 1更短,同时比b++更清晰和灵活,所以大多数人会递增:

代码语言:javascript
运行
复制
b += 1

这会将b重新分配给b+1。这不是递增运算符,因为它不会递增b,而是重新分配它。

简而言之: Python在这里的行为不同,因为它不是C语言,也不是机器代码的低级包装器,而是一种高级动态语言,在这种语言中,增量没有意义,而且也不像C那样必要,例如,在C中,每次有循环时都会使用增量。

票数 425
EN

Stack Overflow用户

发布于 2012-06-26 22:59:34

虽然其他答案是正确的,因为它们显示了纯粹的+通常所做的事情(即,如果是1,则保留数字原样),但由于它们没有解释发生了什么,所以它们是不完整的。

准确地说,+x的计算结果为x.__pos__()++x的计算结果为x.__pos__().__pos__()

我可以想象一个非常奇怪的类结构(孩子们,不要在家里这样做!)如下所示:

代码语言:javascript
运行
复制
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)
票数 56
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1485841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档