为什么没有++;以及--​;Python中的运算符?

为什么没有++;以及--​;Python中的运算符?,python,operators,Python,Operators,为什么Python中没有++和-操作符?它就是这样设计的。递增和递减运算符只是x=x+1的快捷方式。Python通常采用一种设计策略,以减少执行操作的替代方法的数量。是Python中最接近增量/减量运算符的东西,直到Python 2.0才添加它们。这不是因为它没有意义;将“x++”定义为“x++=1,计算到x的上一个绑定”是非常有意义的 如果您想知道最初的原因,您必须浏览旧的Python邮件列表,或者询问当时在场的人(例如Guido),但事后很容易证明: 简单的递增和递减不像其他语言那样需要。你

为什么Python中没有
++
-
操作符?

它就是这样设计的。递增和递减运算符只是
x=x+1
的快捷方式。Python通常采用一种设计策略,以减少执行操作的替代方法的数量。是Python中最接近增量/减量运算符的东西,直到Python 2.0才添加它们。

这不是因为它没有意义;将“x++”定义为“x++=1,计算到x的上一个绑定”是非常有意义的

如果您想知道最初的原因,您必须浏览旧的Python邮件列表,或者询问当时在场的人(例如Guido),但事后很容易证明:

简单的递增和递减不像其他语言那样需要。你不会经常用Python编写
for(inti=0;i<10;++i)
;相反,您可以对范围(0,10)内的i执行
之类的操作

因为它几乎不需要那么频繁,所以没有理由给它自己的特殊语法;当您确实需要增加时,
+=
通常就可以了

这不是一个决定,它是否有意义,或者它是否可以做到——它是,它可以做到。这是一个是否值得添加到语言核心语法中的问题。记住,这是四个操作符——postinc、postdec、preinc、predec,每个操作符都需要有自己的类重载;它们都需要指定,并进行测试;它将向语言中添加操作码(意味着虚拟机引擎更大,因此速度较慢);每个支持逻辑增量的类都需要实现它们(在
+=
-=
之上)


这与
+=
-=
都是多余的,因此这将成为一个净损失。

我写的这个原始答案是一个来自计算民间传说的神话。:Dennis Ritchie在2012年7月致ACM通讯编辑的信中指出,Dennis Ritchie揭穿了“历史上不可能的”


C递增/递减运算符是在C编译器不是很聪明的时候发明的,作者希望能够指定使用机器语言运算符的直接意图,这样可以为可能执行某些操作的编译器节省一些周期

load memory
load 1
add
store memory
而不是

inc memory 
PDP-11甚至支持分别对应于
*++p
*p++
的“自动增量”和“自动增量延迟”指令。如果非常好奇,请参见第5.3节

由于编译器足够聪明,能够处理C语法中内置的高级优化技巧,因此它们现在只是一种语法上的便利


Python没有向汇编程序传达意图的技巧,因为它没有使用任何技巧。

我对Python非常陌生,但我怀疑原因在于语言中强调可变和不可变对象。现在,我知道可以很容易地将x++解释为x=x+1,但它看起来像是在增加一个可能是不可变的对象


只是我的猜测/感觉/预感。

也许一个更好的问题是问为什么在C.K&R调用中存在这些运算符增量和减量运算符“不寻常”(第46页第2.8节)。导言称之为“更简洁、更高效”。我怀疑这些操作总是出现在指针操作中,这一事实也在它们的引入中起到了作用。
在Python中,可能已经决定尝试优化增量是没有意义的(事实上,我只是用C做了一个测试,似乎gcc生成的程序集在这两种情况下都使用addl而不是incl),并且没有指针算法;因此,这可能只是另一种方法,我们知道Python讨厌这种方法。

因为在Python中,整数是不可变的(int的+=实际上返回一个不同的对象)

此外,使用++/--您需要担心增量/减量前后的差异,只需再按一次键即可写入
x+=1
。换言之,它避免了潜在的混乱,但却牺牲了极少的收益。

当然,我们可以说“Guido刚刚决定采用这种方式”,但我认为问题实际上是关于做出这一决定的原因。我认为有几个原因:

  • 它将语句和表达式混合在一起,这不是好的做法。看
  • 它通常鼓励人们编写可读性较差的代码
  • 语言实现中的额外复杂性,这在Python中是不必要的,如前所述

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

我一直认为这与Python禅宗的这一行有关:

应该有一种——最好只有一种——显而易见的方法来做到这一点


x++和x+=1做完全相同的事情,因此没有理由两者都有

首先,Python只受到C语言的间接影响;它受到的影响很大,因此在Python中也没有找到它们也不应该感到惊讶

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

第三,对
++
-->
操作符集的完全支持通常包括对它们的前缀和后缀版本的支持。在C和C++中,这可能导致各种“可爱”的结构,似乎(我)反对Python拥抱的简单和直率的精神。
例如,C语句
while(*t++=*s++)似乎简单而优雅,对于学习它的人来说,它一点也不简单。加上前缀和后缀的增量和减量,即使是许多专业人士也不得不停下来想一想。

据我所知,这样你就不会
In [19]: id(a)
Out[19]: 34019256

In [20]: id(b)
Out[20]: 34019256

In [21]: id(c)
Out[21]: 34019256
In [22] a = a + 1

In [23]: id(a)
Out[23]: 34019232

In [24]: id(b)
Out[24]: 34019256

In [25]: id(c)
Out[25]: 34019256
>>> i=12
>>> ++i
12
>>> --i
12
>>> a = 1
>>> b = (a:=a+1)
>>> b
2
>>> a
2
>>> a = 1
>>> b = (a:=a+1)-1
>>> b
1
>>> a
2
i = 0
stuff = {'a': 'b', 'c': 'd', 'e': 'f'}
uniquestuff = {}
for key, val in stuff.items() :
  uniquestuff[key] = '{0}{1}'.format(val, i)
  i += 1
for i, (key, val) in enumerate(stuff.items()) :
a,b = (a+1,)*2
a,b = a+1, a
foo(a:=a+1)