python不支持_Python 为啥不支持i++

作者:Pawan Jain

编译:McGL

公众号:PyVision(欢迎关注,专注CV,偶尔CS)

Why doesn't Python support i++ increment syntax

有一天,看到有人问为什么在 Python 中不使用++操作符时,下面这一行引起了我的注意。如果你想知道原因,那么要么浏览旧的 Python 邮件列表,要么询问当时做出决定的人(例如 Guido) ——来源: stackoverflow

这迫使我像上面的图片一样思考。 我真的应该问Guido原因吗?也许吧,但在此之前,我应该尝试一下,这就是我写这篇文章的原因。

在 C/C++/Java 等语言中,整数(integer)变量的自增或自减操作都是标准的,可以分为前缀(++i 和 --i)和后缀(i++ 和 i--)两种操作,每种操作都有一些细微的差别和不同的用途。

当这些语言的用户使用 Python 时,他们可能会奇怪为什么 Python 不提供 ++ 或 -- 操作。

虽然前缀形式 ++i 可能出现在 Python 中,但它不是“ ++ ”自增运算符。

在这种情况下,它只是两个“ + ”(正号)的叠加,而且“ ++ ”后缀根本不被支持(SyntaxError: invalid syntax)。那么为什么 Python 不支持 i++自增语法呢?

首先,Python 当然可以达到自增的效果,即写成 i += 1或 i = i + 1的形式,这在其它语言中也很常见。

尽管 Python 在底层使用了不同的魔法方法( __add__() 和 __iadd__() )来完成计算,但是对表面的影响是完全相同的。

因此,我们的问题可以转化为为什么上述两种编码风格会比 i++ 更好,并成为 Python 的最终选择?

1. Python 整数(integers)是不可变(immutable)的类型

当我们定义 i = 1000时,不同的语言会有区别。C之类的语言 (代码 int i = 1000) 将申请内存空间,并“绑定”到一个固定的变量名称i, 同时写变量值为1000

这里,i 的地址和类型是固定的,值是可变的。Python(代码i = 1000) 也会申请内存空间,但它将“绑定”到数字1000,也就是说,这个1000的地址和类型是不变的

因此,当我们让 i“自增”(i = i + 1)时,两者处理不同。像 C 这样的语言首先找到存储在地址i中的值, 然后加1。操作完成后,新值将替换旧值。

Python 的操作过程是将i指向的数值加1,然后,它将结果绑定到一个新申请的内存空间,再“粘贴”上标签i。

打个比方: C 中的 i 类似于宿主,数字1000是寄生的;而 Python 中的1000类似于宿主, i 是寄生的。所以 C 中的 i 和 Python 中的1000是一样的。

有了上面的铺垫,让我们来看看 i++ ,不难发现:在 类C 语言中,i++ 代表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 中没有这样的 for 结构,它提供了一种更优雅的方式:

这里反映了不同的思维方式。它关心值范围内的迭代遍历

它不在乎也不需要人为地增加数字。

Python 中的迭代对象/迭代器/生成器提供了非常好的迭代/遍历用法,可以完全替换 i++ 。

例如,Python 可以使用 enumerate ()迭代上面示例中的值,同时遍历下标和对应值。

另一个例子,对于字典遍历,Python 提供了 keys ()、 values ()、 items ()和其它遍历方法,这些方法非常容易使用:

不仅 i += 1或 i = i + 1在 Python 中很少使用,而且迭代对象的可用性使得操作一系列值变得很容易,而且很少声明需要累积这些值。

因此,回到我们最初的问题,这两种“自增长”方法并不比 i++ 好多少,仅仅因为它们是通用操作。

这就是为什么不需要引入新的运算符,Python 继续提供基础性支持的原因。真正的赢家是各种可迭代对象!

总结

出于以下原因,Python 不支持增量运算符因为它的整数是不可变类型的一等公民,如果要支持增量操作(+ +) ,它将带来歧义。

主要是因为它有一个更合适的实现,即迭代对象,它对遍历操作有很好的支持

讲完啦,希望你们喜欢。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值