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


当前回答

清晰!

Python非常强调清晰度,没有程序员能够正确地猜出——a的含义,除非他/她学过一种具有这种结构的语言。

Python还在很大程度上避免了引起错误的构造,而++操作符是众所周知的缺陷的丰富来源。 这两个原因足以让Python中不使用这些操作符。

决定Python使用缩进来标记块而不是 而不是句法手段,比如某种形式的开始/结束括号 或者强制性的结束标记很大程度上是基于同样的考虑。

为了说明问题,我们来看看关于引入条件操作符的讨论(在C: cond ?resultif: resultelse)在2005年加入Python。 至少阅读该讨论的第一条信息和决定信息(前面有几个关于同一主题的前奏)。

花絮: 其中经常提到的PEP是“Python增强提案”PEP 308。LC表示列表理解,GE表示生成器表达式(如果这些使您感到困惑,请不要担心,它们不是Python中少数复杂的地方)。

其他回答

清晰!

Python非常强调清晰度,没有程序员能够正确地猜出——a的含义,除非他/她学过一种具有这种结构的语言。

Python还在很大程度上避免了引起错误的构造,而++操作符是众所周知的缺陷的丰富来源。 这两个原因足以让Python中不使用这些操作符。

决定Python使用缩进来标记块而不是 而不是句法手段,比如某种形式的开始/结束括号 或者强制性的结束标记很大程度上是基于同样的考虑。

为了说明问题,我们来看看关于引入条件操作符的讨论(在C: cond ?resultif: resultelse)在2005年加入Python。 至少阅读该讨论的第一条信息和决定信息(前面有几个关于同一主题的前奏)。

花絮: 其中经常提到的PEP是“Python增强提案”PEP 308。LC表示列表理解,GE表示生成器表达式(如果这些使您感到困惑,请不要担心,它们不是Python中少数复杂的地方)。

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

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

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

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

其他答案描述了为什么迭代器不需要它,但有时它在赋值以inline增加变量时很有用,你可以使用元组和多次赋值达到相同的效果:

B = ++a变成:

a,b = (a+1,)*2

b = a++变成:

a,b = a+1, a

Python 3.8引入了赋值:=操作符,允许我们用

foo(a:=a+1)

Foo (a++)仍然是难以捉摸的。

我对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

所有三个变量(标签)都指向同一个对象。现在增加变量之一,看看它是如何影响内存地址的:

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

你可以看到变量a现在指向另一个对象,变量b和c。因为你已经使用了a = a + 1,这是明确的。换句话说,你将完全另一个对象赋值给标签a。想象一下,你可以写一个++,这将表明你没有给变量赋值一个新对象,而是给旧对象赋值。所有这些东西都是为了尽量减少混淆。为了更好地理解python变量是如何工作的:

在Python中,为什么函数可以修改调用者感知到的一些参数,而不能修改其他参数?

Python是按值调用还是按引用调用?既不。

Python是按值传递还是按引用传递?

Python是按引用传递还是按值传递?

如何通过引用传递变量?

理解Python变量和内存管理

在python中模拟值传递行为

Python函数通过引用调用

像Pythonista一样编写代码:地道的Python

正如我理解的那样,你不会认为内存中的值被改变了。 在c语言中,当你执行x++时,内存中的x值会发生变化。 但在python中,所有数字都是不可变的,因此x指向的地址仍然是x而不是x+1。当你写x++时,你会认为x改变了,实际上发生的是x引用被改变到内存中存储x+1的位置,或者如果doe不存在,重新创建这个位置。