在像C/C++/Java这样的语言中,整数变量的增量或减量操作是标准的。它们可以分为前缀操作(++i
和— i
)和后缀操作(i++
和i —
),它们之间有微妙的差异和不同的用途。
使用这些语言的用户可能会想知道为什么Python不提供++
或—
操作。
虽然在Python中可以以前缀形式编写++i
,但它实际上没有“++”增量运算符。它只是两个“+”号(正号)的相加。至于后缀形式“++”,根本不受支持(SyntaxError: invalid syntax)。
我们将从两个主要的角度回答:为什么Python不支持i++增量语法?(注:这里,增量指的是增加和减少,类似)
首先,Python肯定可以通过编写i += 1
或i = i + 1
来实现增量效果,这在其他语言中也很常见。
尽管Python在较低级别上使用不同的魔法方法(__add__()
和__iadd__()
)来执行计算,但表面效果完全相同。
因此,我们的问题可以转化为:为什么上述两种形式优于i++,成为Python的最终选择?
当我们定义i = 1000
时,不同的语言会有不同的处理方式:
int i = 1000
)将分配一块内存并将其“绑定”到一个固定的名称i,同时写入可变值1000。在这里,i的地址和类型是固定的,而值在一定范围内是可变的。i = 1000
)也会分配一块内存,但它将“绑定”到数字1000。这个1000的地址和类型是固定的(不可变的),而i只是一个标签,附加到1000上,没有固定的地址和类型。因此,当我们增量i(i = i + 1)时,它们的处理方式是不同的:
i
指向的数字,然后将结果绑定到新分配的内存块,然后将名字标签i
附加到这个新数字上。新旧数字都可以共存;它们不会相互替换。用一个不太恰当的类比来说:在C中,i就像是寄主,带有数字1000寄生在上面;在Python中,数字1000就像是寄主,带有名字标签‘i’寄生在上面。C中的‘i’和Python中的‘number’都寄生在底层内存空间上……
也可以理解为:在C中,变量i是一等公民,数字1000是它的可变属性之一;在Python中,数字1000是一等公民,名字i是它的可变属性之一。
有了上述准备,让我们来看一下i++
,并不难发现:
如果Python支持i++,其操作过程将比C的i++更加复杂,其含义将不再是“增加1”(增量),而是“创建一个新数字”(加法)。在这种情况下,“增量运算符”的名字就不再合适。
Python在理论上可以实现i++的操作,但那么它必须重新定义“增量运算符”,这可能会让有其他语言经验的人产生误解。直接写成i += 1
或i = i + 1
对每个人来说都更好。
在像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 += 1
或i = i + 1
很少被使用,因为到处都是可迭代对象。开发者可以轻松地在数字范围上执行操作,并且对于累积特定值的需求很少。
因此,回到我们最初的问题,这两种“增量”方法并没有超越i++太多。只是它们是通用操作,不需要引入新的运算符,这就是为什么Python继续将它们作为基本操作支持的原因。真正的赢家是各种可迭代对象!
Python不支持增量运算符,因为它的整数是不可变的一等公民。支持增量操作(++)将引入歧义。此外,它有更适合的实现,如可迭代对象,为遍历操作提供了良好的支持。