Gle*_*ard 432
这不是因为它没有意义; 将"x ++"定义为"x + = 1,评估x的先前绑定"是完全合理的.
如果你想知道最初的原因,你必须要么通过旧的Python邮件列表或者询问那里的人(例如Guido),但事实证明这很容易证明:
不需要像其他语言那样简单的增量和减量.你不for(int i = 0; i < 10; ++i)经常写Python之类的东西; 相反,你做的事情for i in range(0, 10).
由于它几乎不需要经常使用,因此没有理由给它自己特殊的语法; 当你需要增加时,+=通常就好了.
这不是决定它是否有意义,或者它是否可以完成 - 它确实如此,它可以.这是一个问题,是否有益于增加语言的核心语法.请记住,这是四个运算符 -  postinc,postdec,preinc,predec,并且每个运算符都需要有自己的类重载; 他们都需要被指定和测试; 它会在语言中添加操作码(暗示一个更大的,因此更慢的VM引擎); 每个支持逻辑增量的类都需要实现它们(在+=和之上-=).
这对于+=和-=,都是多余的,因此它将成为净损失.
msw*_*msw 82
我写的这个原始答案是来自计算民间传说的神话:Dennis Ritchie将其揭穿为"历史上不可能",如2012年7月ACM通讯编辑的信中所述:10.1145/2209249.2209251
C增量/减量运算符是在C编译器不是很聪明的时候发明的,并且作者希望能够指定应该使用机器语言运算符的直接意图,这为编译器保存了一些循环.可能会做一个
load memory
load 1
add
store memory
Run Code Online (Sandbox Code Playgroud)
代替
inc memory 
Run Code Online (Sandbox Code Playgroud)
并且PDP-11甚至支持分别对应于*++p和的"自动增量"和"自动递增延迟"指令*p++.如果非常好奇,请参阅手册的第5.3节.
由于编译器足够聪明,可以处理C语法中内置的高级优化技巧,因此它们现在只是语法上的便利.
Python没有把意图传达给汇编程序的技巧,因为它没有使用它.
GSt*_*Sto 63
我总是认为它与python的这一行有关:
应该有一个 - 最好只有一个 - 显而易见的方法.
x ++和x + = 1完全相同,所以没有理由同时使用两者.
EMP*_*EMP 36
当然,我们可以说"Guido就是这样决定的",但我认为这个问题的真正原因在于这个决定.我认为有几个原因:
Nat*_*vis 16
因为,在Python中,整数是不可变的(int的+ =实际上返回一个不同的对象).
此外,使用++/ - 您需要担心前后增量/减量,并且只需要再写一次键击x+=1.换句话说,它以非常小的收益为代价避免了潜在的混淆.
Lut*_*elt 12
Python非常清晰,没有程序员可能正确地猜测其含义,--a除非他/他学会了具有该结构的语言.
Python也是很多关于避免引发错误的构造,并且++已知运算符是丰富的缺陷源.这两个原因足以让Python中没有这些运算符.
Python使用缩进来标记块而不是语法手段(例如某种形式的开始/结束包围或强制结束标记)的决定主要基于相同的考虑因素.
为了说明,看看在各地引入有条件的经营者讨论(在C: cond ? resultif : resultelse)至少在2005年读成Python的第一条消息和决策信息是的讨论(这不会对同一主题的几个前体之前).
琐事: 其中经常提到的PEP是"Python扩展提案" PEP 308.LC意味着列表理解,GE意味着生成器表达(如果那些让你困惑,不要担心,它们不是Python的少数复杂点).
我对python没有++运算符的理解如下:当你在python中编写它时,a=b=c=1你会得到三个指向同一个对象的变量(标签)(值为1).您可以使用id函数验证这一点,该函数将返回一个对象内存地址:
In [19]: id(a)
Out[19]: 34019256
In [20]: id(b)
Out[20]: 34019256
In [21]: id(c)
Out[21]: 34019256
Run Code Online (Sandbox Code Playgroud)
所有三个变量(标签)都指向同一个对象.现在增加一个变量并查看它如何影响内存地址:
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
Run Code Online (Sandbox Code Playgroud)
您可以看到该变量a现在指向另一个对象作为变量b和c.因为你已经习惯了a = a + 1它是明确的.换句话说,您将另一个对象分配给标签a.想象一下,你可以写a++它会建议你没有分配给变量a新对象但是ratter增加旧对象.所有这些东西都是恕我直言,以尽量减少混乱.为了更好地理解python变量的工作原理:
在Python中,为什么函数可以修改调用者所感知的某些参数,而不是其他参数?
我对python很新,但我怀疑原因是因为语言中可变和不可变对象之间的重点.现在,我知道X ++很容易被解释为X = X + 1,但它看起来像你递增就地对象可能是不可改变的.
只是我的猜测/感觉/预感.
要完成该页面上已经好的答案:
假设我们决定这样做,前缀 ( ++i) 会破坏一元 + 和 - 运算符。
今天,前缀++or--不执行任何操作,因为它启用一元加运算符两次(不执行任何操作)或一元减运算符两次(两次:取消自身)
>>> i=12
>>> ++i
12
>>> --i
12
Run Code Online (Sandbox Code Playgroud)
所以这可能会打破这个逻辑。
现在,如果需要列表推导或 lambda,从 python 3.8 开始,可以使用新的:=赋值运算符 ( PEP572 )
预递增a并将其分配给b:
>>> a = 1
>>> b = (a:=a+1)
>>> b
2
>>> a
2
Run Code Online (Sandbox Code Playgroud)
后递增只需要通过减 1 来弥补过早的加法:
>>> a = 1
>>> b = (a:=a+1)-1
>>> b
1
>>> a
2
Run Code Online (Sandbox Code Playgroud)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           258379 次  |  
        
|   最近记录:  |