这不是因为它没有意义; 定义“x ++”为“x + = 1,评估x的前一个绑定”是非常有意义的。
如果你想知道原来的原因,你必须通过旧的Python邮件列表来查询,或者询问那些在那里的人(比如Guido),但是事实certificate这很容易:
简单的递增和递减不像其他语言那样需要。 你不经常在Python中编写像for(int i = 0; i < 10; ++i) ; 而是你for i in range(0, 10)做for i in range(0, 10)喜欢for i in range(0, 10)事情。
由于它几乎不经常需要,所以给它自己的特殊语法的理由要less得多。 当你需要增加时, +=通常就好。
这不是一个有意义的决定,也不是一个决定,也不是决定它是否可行。 这是一个问题,是否值得添加到语言的核心语法的好处。 请记住,这是四个运算符 – postinc,postdec,preinc,predec,每一个都需要自己的类重载; 他们都需要指定和testing; 它会将操作码添加到语言中(意味着更大,因此速度更慢的VM引擎); 每个支持逻辑增量的类都需要实现它们(在+=和-=之上)。
这与+=和-=都是多余的,所以它将成为净亏损。
我写的这个最初的答案是计算机民俗学的一个神话 :被丹尼斯·里奇(Dennis Ritchie)揭穿为“在历史上是不可能的”,正如在致ACM的通信编辑的信中所指出的那样2012年7月doi:10.1145 / 2209249.2209251
C语言的增量/减量操作符是在C编译器不太聪明的时候发明的,作者希望能够指定应该使用机器语言操作符的直接意图,这为编译器节省了less量的周期可能会做一个
load memory load 1 add store memory
代替
inc memory
而且PDP-11甚至分别支持对应于*++p和*p++ “自动增量”和“自动递增”指令。 如果非常好奇,请参阅手册 5.3节。
由于编译器足够聪明,可以处理C语言中的高级优化技巧,所以它们现在只是语法上的便利。
Python没有把意图传达给汇编器的技巧,因为它不使用它。
我一直认为它必须做的python禅的这一行:
应该有一个 – 最好只有一个 – 明显的方法来做到这一点。
x ++和x + = 1做同样的事情,所以没有理由有两个。
当然,我们可以说“Guido就是这样决定的”,但我认为这个问题真的是这个决定的原因。 我认为有几个原因:
它将语句和expression混合在一起,这不是好的做法。 请参阅http://norvig.com/python-iaq.html
它通常会鼓励人们编写更less的可读代码
如前所述,Python语言实现中额外的复杂性是不必要的
因为在Python中,整数是不可变的(int的+ =实际上返回一个不同的对象)。
另外,用++ / – 你需要担心前后递增/递减,并且只需要一个按键来写x+=1 。 换句话说,它可以避免潜在的混淆,代价很小。
这只是这样devise的。 递增和递减运算符只是x = x + 1快捷键。 Python通常采用一种devise策略来减less执行操作的替代手段的数量。 增加赋值是在Python中增加/减less运算符最接近的东西,甚至在Python 2.0之前,它们都没有被添加。
我对python很陌生,但我怀疑是因为语言中可变和不可变对象之间的重点。 现在,我知道x ++可以很容易被解释为x = x + 1,但是它看起来像是在增加一个可能是不可变的对象。
只是我的猜测/感觉/预感。
明晰!
Python对于清晰度有很大的要求,程序员不可能正确猜测--a的含义,除非他/她学习了一种具有该构造的语言。
Python也避免了引发错误的构造,而++运算符被认为是缺陷的丰富来源。 这两个原因足以让Python中没有这些运算符。
Python使用缩进来标记块而不是语法的方式(例如某种forms的开始/结束包围或强制结束标记)的决定主要基于相同的考虑。
为了说明,请看2005年关于在Python中引入条件运算符 (在C: cond ? resultif : resultelse )中的讨论。至less阅读第一条消息和该讨论的决定消息 (其中有几个前体话题)。
琐事: PEP经常提到的是“Python扩展build议” PEP 308 。 LC意味着列表理解 ,GE意味着生成器expression式 (如果这些让你困惑,不要担心,它们不是Python的几个复杂的地方)。
我对Python为什么没有++运算符的理解如下:当你在python a=b=c=1写入时,你会得到三个variables(标签)指向同一个对象(值为1)。 你可以通过使用id函数来validation这将返回一个对象的内存地址:
In [19]: id(a) Out[19]: 34019256 In [20]: id(b) Out[20]: 34019256 In [21]: id(c) Out[21]: 34019256
所有三个variables(标签)指向相同的对象。 现在增加一个variables,看看它如何影响内存地址:
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
你可以看到variablesa现在指向另一个对象variablesb和c 。 因为你已经使用a = a + 1所以明确地清楚了。 换句话说,你完全分配另一个对象来标记a 。 想象一下,你可以写a++它会build议你没有分配给variablesa新的对象,但喋喋不休旧的。 所有这些东西是恕我直言,最大限度地减less混乱。 为了更好地理解pythonvariables是如何工作的:
在Python中,为什么函数可以修改调用者感觉到的一些参数,而不是其他的?
Python是按值调用还是按引用调用? 都不是。
Python是通过值传递还是通过引用传递?
Python是通过引用还是按值传递?
Python:如何通过引用传递variables?
了解Pythonvariables和内存pipe理
在Python中模仿传值的行为
Python函数通过引用调用
像Pythonista一样的代码:习惯Python
我相信它源于Python的信条,即“明确比隐含更好”。
首先,Python仅受C的间接影响; 它受到ABC很大的影响,这显然没有这些运营商 ,所以也不应该在Python中find它们。
其次,正如其他人所说,增量和减量是由+=和-=支持的。
第三,完全支持++和--运算符集通常包括支持它们的前缀和后缀版本。 在C和C ++中,这可能会导致各种“可爱”的构造,这些构造在我看来是违背了Python所支持的简单性和直接性的精神。
例如,虽然C语句while(*t++ = *s++); 对于一个有经验的程序员来说,看起来简单而优雅,对于一个学习它的人来说,它并不简单。 在前缀和后缀的增量和减量的混合,甚至许多专业人士将不得不停下来思考一下。
这可能是因为@GlennMaynard正在研究与其他语言相比较的问题,但在Python中,您是以python的方式来执行的。 这不是一个“为什么”的问题。 它在那里,你可以用x+=来做同样的事情。 在Python的禅宗中 ,它给出了:“应该只有一种解决问题的方法”。 艺术(expression自由)有多种select,但在工程上很糟糕。
正如我所理解的,所以你不会认为内存中的价值会发生变化。 在c中,当你做x ++时,x在内存中的值发生了变化。 但在python中,所有数字都是不可变的,因此x指向的地址仍然有x不是x + 1。 当你写x ++的时候,你会认为x改变真正发生的事情是x refrence被改变到存储x + 1的位置,或者如果doe不存在,重新创build这个位置。
++类的运算符是带有副作用的expression式。 这在Python中通常是找不到的。
出于同样的原因,赋值不是Python中的expression式,因此阻止了常见的if (a = f(...)) { /* using a here */ }成语。
最后,我怀疑那里的操作符与Pythons的引用语义不太一致。 请记住,Python没有variables(或指针)与从C / C ++中已知的语义。
也许更好的问题是问为什么这些操作符存在于C和K中,称为增量和减量操作符的“exception”(第2.8页第46页)。 简介称他们“更简洁,更经常更高效”。 我怀疑这些操作总是出现在指针操作上的事实也在他们的介绍中起了一部分作用。 在Python中,可能已经决定尝试优化增量是没有意义的(事实上,我只是在C中做了一个testing,似乎gcc生成的程序集在两种情况下都使用addl代替incl),并且没有指针运算; 所以它将只是一个方法来做到这一点,我们知道Python讨厌这个。
要在该页面上完成已经很好的答案:
假设我们决定这么做,前缀( ++i )会打破一元+和 – 运算符。
今天,以++或--前缀,什么都不做,因为它启用一元加运算符两次(不做任何事)或一元减两次(两次:取消自己)
>>> i=12 >>> ++i 12 >>> --i 12
所以这可能会破坏这个逻辑。
++运算符与+ =运算符不完全相同。 其实两者的结果是一样的,但使用有一些差异。 例如,你可以在三元条件,循环等中使用++运算符,但是不能使用+ =。 底部,我们觉得需要++和 – ,为此。
您可以使用
element = iter(data_list) a = next(element) b = next(element) c = next(element)