两点带你轻松理解Python中不使用 i++

在像C/C++/Java这样的语言中,整数变量的增量或减量操作是标准的。它们可以分为前缀操作(++i— i)和后缀操作(i++i —),它们之间有微妙的差异和不同的用途。

使用这些语言的用户可能会想知道为什么Python不提供++操作。

虽然在Python中可以以前缀形式编写++i,但它实际上没有“++”增量运算符。它只是两个“+”号(正号)的相加。至于后缀形式“++”,根本不受支持(SyntaxError: invalid syntax)。

我们将从两个主要的角度回答:为什么Python不支持i++增量语法?(注:这里,增量指的是增加和减少,类似)

首先,Python肯定可以通过编写i += 1i = i + 1来实现增量效果,这在其他语言中也很常见。

尽管Python在较低级别上使用不同的魔法方法(__add__()__iadd__())来执行计算,但表面效果完全相同。

因此,我们的问题可以转化为:为什么上述两种形式优于i++,成为Python的最终选择?

1. Python中的整数是不可变类型

当我们定义i = 1000时,不同的语言会有不同的处理方式:

  • 像C这样的语言(写作int i = 1000)将分配一块内存并将其“绑定”到一个固定的名称i,同时写入可变值1000。在这里,i的地址和类型是固定的,而值在一定范围内是可变的。
  • Python(写作i = 1000)也会分配一块内存,但它将“绑定”到数字1000。这个1000的地址和类型是固定的(不可变的),而i只是一个标签,附加到1000上,没有固定的地址和类型。

因此,当我们增量i(i = i + 1)时,它们的处理方式是不同的:

  • 在像C这样的语言中,首先找到i地址处存储的值,然后将1添加到它。操作后,新值替换旧值。
  • 在Python中,该过程涉及将1添加到由i指向的数字,然后将结果绑定到新分配的内存块,然后将名字标签i附加到这个新数字上。新旧数字都可以共存;它们不会相互替换。

用一个不太恰当的类比来说:在C中,i就像是寄主,带有数字1000寄生在上面;在Python中,数字1000就像是寄主,带有名字标签‘i’寄生在上面。C中的‘i’和Python中的‘number’都寄生在底层内存空间上……

也可以理解为:在C中,变量i是一等公民,数字1000是它的可变属性之一;在Python中,数字1000是一等公民,名字i是它的可变属性之一。

有了上述准备,让我们来看一下i++,并不难发现:

  • 在像C这样的语言中,i++可以表示对i的数字属性的增加。它不会分配新的内存空间或创建新的一等公民
  • 在像Python这样的语言中,如果i++是对其名称属性的操作,那就毫无意义(你不能按字母顺序将i更改为j:D)。如果理解为对数值实体的操作,那么情况就变得复杂了:它将创建一个新的一等公民1001,因此需要为其分配一个内存地址。此时,如果占用1000的地址,涉及回收旧对象,所有与1000的现有引用关系都将受到影响。因此,只有通过分配新的内存空间才能给出1001。

如果Python支持i++,其操作过程将比C的i++更加复杂,其含义将不再是“增加1”(增量),而是“创建一个新数字”(加法)。在这种情况下,“增量运算符”的名字就不再合适。

Python在理论上可以实现i++的操作,但那么它必须重新定义“增量运算符”,这可能会让有其他语言经验的人产生误解。直接写成i += 1i = i + 1对每个人来说都更好。

2. Python具有可迭代对象

在像C/C++这样的语言中设计i++的主要目的是为了方便使用三部分结构的循环。

for(int i = 0; i < 100; i++){  
    // 执行xxx  
}

这个程序关注的是数字的自增过程,其中数字的加法与程序体的执行相关联。

Python没有这种结构语法。相反,它提供了一种更优雅的方式:

for i in range(100):  
    # 执行xxx  
  
my_list = ["Hello", "I'm boleo", "Please follow me!"]  
for info in my_list:  
    print(info)

这反映了不同的思考方式。它关注在数字范围内进行迭代,不需要或关心手动添加数字。

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

例如,在上面的例子中,它实现了对列表中值的遍历。Python还可以使用enumerate()同时遍历索引和特定值。

my_list = ["Hello", "I'm boleo", "Please follow me!"]  
for i, info in enumerate(my_list):  
    print(i, info)  

打印结果:

0 Hello
1 I’m boleo
2 Please follow me!

例如,对于字典的遍历,Python提供了keys()values()items()等方法,非常有用。

my_dict = {'a': '1', 'b': '2', 'c': '3'}  
for key in my_dict.keys():  
    print(key)  
  
for key, value in my_dict.items():  
    print(key, value)

有了这样的工具,就不再需要i++。

不仅如此,在Python中,i += 1i = i + 1很少被使用,因为到处都是可迭代对象。开发者可以轻松地在数字范围上执行操作,并且对于累积特定值的需求很少。

因此,回到我们最初的问题,这两种“增量”方法并没有超越i++太多。只是它们是通用操作,不需要引入新的运算符,这就是为什么Python继续将它们作为基本操作支持的原因。真正的赢家是各种可迭代对象!

总结

Python不支持增量运算符,因为它的整数是不可变的一等公民。支持增量操作(++)将引入歧义。此外,它有更适合的实现,如可迭代对象,为遍历操作提供了良好的支持。

你可能感兴趣的:(Python,python,linux)