当前位置: 首页 > 科技观察

为什么Python不支持i++语法

时间:2023-03-14 15:10:09 科技观察

简要讨论为什么它不提供++作为运算符通常,当有人问为什么++不是Python中的运算符时,这行代码引起了我的注意。如果你首先想知道为什么,你将不得不挖掘旧的Python邮件列表,或者问那里的人(比如Guido)~通过stackoverflow这迫使我像上图一样思考。我真的必须问Guido为什么吗?好吧,也许吧,但在那之前,我应该试一试,这促使我写了这篇文章或者自减操作是标准的,可以分为前缀操作(++i和–i)和后缀操作(i++和i–),每个都有细微的差别和不同的目的。当这些语言的用户接触到Python时,他们可能会奇怪为什么它不提供++或-操作。虽然前缀++i可能出现在Python中,但它并不是“++”自增运算符。在这种情况下,它只是两个“+”(正号)的叠加,而“++”后缀是完全不支持的!(语法错误:语法无效)。那么,为什么Python不支持i++增量语法呢?首先,Python当然可以实现自增,即写成i+=1或i=i+1的形式,这在其他语言中也很常见。尽管Python在底层使用了不同的魔法方法(add()和__iadd__())来进行计算,但表面效果是完全一样的。因此,我们的问题可以转化为:为什么以上两种写法会比i++好,成为Python的最终选择?1.Python整数是不可变类型当我们定义i=1000时,不同的语言对待它们的方式不同。像C这样的语言(写入int=1000)会适应内存空间,并在写入变量值1000时将其“绑定”到固定名称i。这里,i的地址和类型是固定的,但值为多变的。Python(写i=1000)也会分配内存空间,但它会被“绑定”到数字1000,即1000的地址和类型是不可变的,所以当我们让i“自增”(i=i+1)、两者区别对待。C等语言先找到i地址存放的值,然后加1。操作后,新值将替换旧值。Python的操作是将i指向的数字加1,然后将结果绑定到新应用程序的存储空间,然后将名称标签“粘贴”到新数字上。例如:C中的i就像寄生了1000的宿主,Python中的1000就像寄生了i的宿主。所以i在C中和Python中的1000是一样的综上所述,我们看i++不难发现:没有新的内存空间被打开,也没有新的一等公民被创建。在像Python这样的语言中,如果i++是对其名称属性的操作,这就没有意义。如果理解为对数字本体的操作,那么情况就复杂了。会生成一个新的一等公民1001,所以需要分配一个内存地址。如果此时占用的地址是1000,就会涉及旧对象的回收,原来与1000的引用关系也会受到影响。因此,只能为1001开辟一块新的内存空间。如果Python支持i++,其运算过程会比C++复杂,其意义不再是“将数字增加1”(增量),而是“创建一个新的数字”。Python理论上可以实现i++操作,但它必须重新定义“增量运算符”,这对有其他语言经验的人来说会产生误导。最好让大家直接写i+=1或者i=i+1就好了。2.Python有可迭代对象像C/C++这样的语言主要是为了方便设计了i++的for循环结构的一部分。这个过程与数字本身的自增过程有关。数字的递增与程序主体的执行有关。Python中没有这样的构造,它提供了一种更优雅的方法:这里体现了一种不同的思维方式。它关注迭代值的范围。它不关心也不需要人为地添加数字。Python中的Iterables/Iterators/Generators提供了很好的迭代/遍历用法,可以完全替代i++。例如,Python可以像上例一样,使用enumerate()同时迭代下标和特定值。再举个例子,对于字典的遍历,Python提供了keys()、values()、item()等遍历方法,非常好用:不仅是i+=1ori=i+1,而且可用可迭代对象使得操作值范围变得容易,并且很少需要累积它们。所以,回到我们最初的问题,这两个“自增”方法并不比i++好多少,仅仅是因为它们是通用操作,这就是为什么不需要引入新的操作符,Python继续提供基本支持。真正的赢家是各种迭代!总结Python不支持自增运算符,原因如下:因为它的整数是不可变的一等公民,如果要支持自增(++),会带来歧义上的歧义:在这个故事中主要是因为它有一个更合适的实现,迭代器对象,对遍历操作有很好的支持。是的,我们走到了尽头。希望你喜欢