操作符对于现代编程来说绝对是一个至关重要的组成部分。它们通常用于数学运算。Python编程语言有一系列不同的操作符,并且不断添加新的操作符。
有一个运算符具有一些相当有趣的功能和特点,那就是加等运算符。乍一看,这似乎只是加法和等于操作符的基本组合。虽然可能是这样,但有一些非常有趣的特性使该操作符与众不同。今天,我想展示这个操作符的一些有趣的特点和特性。
概述
在深入研究这个奇怪的操作符之前,我们可能应该熟悉一下该语言中通常如何使用这个操作符。在这个意义上,加号等于可以被认为是加法和断言的捷径。而不是像:
- x = 5
- xx = x + 5
- print(x)
- 10
我们可以这样做:
- x = 5
- x += 5
- print(x)
当然,这种操作符的使用取决于个人偏好。有些用户可能更喜欢后一种方法,但在我个人看来,我总是发现加号等于运算符可以使这样的表达式更加简洁。
可变元组
您很可能熟悉Python中的元组和列表数据结构。这是Python中两种不同类型的可迭代一维数组,它们之间只有一个键差。元组是不可变的结构,这意味着一旦定义,元组就不能被更改。列表当然是可变的,它包含了像append()这样的方法。
虽然元组不是可变对象,但有一个关键的区别是许多程序员在观察时忽略的。虽然元组本身可能不是可变的,但其中的类型仍然是可变的。元组仍然是一个数据结构,该元组中的数据仍然属于其各自的类型。然而,Python仍然具有试图改变不可变类型时可能会出现的抛出。考虑到这个功能,我们可以预期下面的代码会显示一个错误,说明元组是不可变的。
- z = (5, 10, 15)
- z[4] = 15
然而,为了证明元组中包含的数据仍然是可变的,如果我们要从元组中取出一些数据,我们可以对它进行修改:
- newnum = z[3]
- newnum = z[2]
- newnum += 5
- print(newnum)
- 20
考虑下面的列表元组:
- letters = (["S", "T"],
- ["A", "D"])
元组本身是一个不可变类型。但是,其中的列表,一个字母在字母L后面,另一个字母在字母L前面,仍然是可变的。如果我们现在试着在这张单子上再加一封信,你觉得会发生什么?
- letters[0] += "Q"
正如预期的那样,我们得到了另一个类型错误,因为元组一旦创建就不能更改。但是,只有在对数据结构调用操作符后才会抛出此类型错误。换句话说,我们可能遇到了异常,但如果我们现在从元组中打印出列表,我们将看到元素实际上已经被添加到列表中:
- print(letters[0])
- ['S', 'T', 'Q']
需要注意的是,它不能直接处理数据类型。Python的有趣之处在于,在基类内部的数据类型和我们可能在基类外部使用的数据类型之间基本上没有关键区别。这意味着我们实际上可以用纯Python重写这些类型。这与大多数语言不同,后者通常包括在语言本身中没有结构化的基础数据类型。
信不信由你,这种类型错误和元组可变性是Python的特性,而不是bug。乍一看,这里似乎犯了某种错误,但考虑到Python的方法学,这一切在某种程度上确实是有意义的。这一切都与Python如何处理数据有关,更重要的是,plus-equals如何处理不同的数据类型。这就是为什么正等号这么棒的部分原因!
仔细看看
现在我们已经知道了加号等于运算符有多奇怪,为了更好地理解其用法中的怪异之处,让我们来看看该运算符实际上是如何工作的。当然,这将是这个操作符上相同函数的Python实现的一个更粗略的版本。代码看起来就像我们期望的那样:
- def plusequals(num1, num2):
- total = num1.__iadd__(num2)
- num1 = total
然而,每当我们使用更大的表达式,而不是简单的数据类型时,我们可以考虑代码看起来更类似于以下内容:
- def plusequals(x[0], element):
- total = x[0].__iadd__(element)
- x[0] = total
当然,正如我们前面提到的,从元组中提取的元素完全可以添加元素。然而,当我们将x的第一个(第0个)索引赋值给新的总数时,就会遇到元组的类型错误。
原文链接:
https://towardsdatascience.com/pythons-most-confusing-operator-96c67d6e661a