为什么Python中没有++和——运算符?


当前回答

我最初写的这个答案是一个来自计算机民间传说的神话:丹尼斯·里奇(Dennis Ritchie)在2012年7月给ACM通讯编辑的信中指出,它被揭穿为“历史上不可能的”doi:10.1145/2209249.2209251


C加/减操作符是在C编译器还不是很聪明的时候发明的,作者希望能够指定应该使用机器语言操作符的直接意图,这为编译器节省了一些周期

load memory
load 1
add
store memory

而不是

inc memory 

PDP-11甚至支持“自动递增”和“自动递增延迟”指令,分别对应于*++p和*p++。如果非常好奇,请参阅手册5.3节。

由于编译器足够聪明,可以处理C语法中内置的高级优化技巧,所以它们现在只是语法上的便利。

Python没有向汇编器传递意图的技巧,因为它不使用这些技巧。

其他回答

这可能是因为@GlennMaynard将这个问题与其他语言进行了比较,但在Python中,你用Python的方式做事。这不是一个“为什么”的问题。它在这里,你可以用x+=做同样的事情。在Python的禅宗中,它被赋予:“应该只有一种方法来解决一个问题。”多重选择在艺术上很好(表达自由),但在工程上很糟糕。

首先,Python只是间接地受到C的影响;它深受ABC的影响,ABC显然没有这些操作符,所以在Python中找不到它们也不足为奇。

其次,正如其他人所说,递增和递减已经由+=和-=支持。

第三,对++和——操作符集的完全支持通常包括对它们的前缀和后缀版本的支持。在C和c++中,这可能会导致各种“可爱的”构造,这些构造(对我来说)似乎违背了Python所信奉的简单和直接的精神。

例如,while C语句while(*t++ = *s++);对于一个有经验的程序员来说,它可能看起来简单而优雅,但对于一个初学者来说,它一点也不简单。加上前缀和后缀的增量和减量的混合,甚至许多专业人士也不得不停下来思考一下。

要完成那一页上已经很好的答案:

让我们假设我们决定这样做,前缀(++i)将打破一元的+和-操作符。

现在,用++或——作为前缀没有任何作用,因为它使一元加运算符两次(没有任何作用)或一元减运算符两次(两次:取消自身)

>>> i=12
>>> ++i
12
>>> --i
12

所以这可能会打破这个逻辑。

现在,如果需要它来进行列表推导或lambdas,从python 3.8开始,可以使用新的:=赋值操作符(PEP572)

预递增a并赋值给b:

>>> a = 1
>>> b = (a:=a+1)
>>> b
2
>>> a
2

后增量只需要通过减1来弥补过早的加法:

>>> a = 1
>>> b = (a:=a+1)-1
>>> b
1
>>> a
2

我认为这与对象的可变性和不变性的概念有关。2,3,4,5在python中是不可变的。参考下图。2在此python进程之前有固定的id。

x++本质上意味着像C一样的原地增量。在C中,x++执行原地增量。因此,x=3, x++会将内存中的3增加到4,不像python中的3仍然存在于内存中。

因此,在python中,你不需要在内存中重新创建一个值。这可能会导致性能优化。

这是一个基于直觉的答案。

我相信这源于Python的信条“显式优于隐式”。