Python中令人困惑的操作符
操作符對于現(xiàn)代編程來說絕對是一個至關(guān)重要的組成部分。它們通常用于數(shù)學(xué)運算。Python編程語言有一系列不同的操作符,并且不斷添加新的操作符。
有一個運算符具有一些相當(dāng)有趣的功能和特點,那就是加等運算符。乍一看,這似乎只是加法和等于操作符的基本組合。雖然可能是這樣,但有一些非常有趣的特性使該操作符與眾不同。今天,我想展示這個操作符的一些有趣的特點和特性。
概述
在深入研究這個奇怪的操作符之前,我們可能應(yīng)該熟悉一下該語言中通常如何使用這個操作符。在這個意義上,加號等于可以被認(rèn)為是加法和斷言的捷徑。而不是像:
- x = 5
- xx = x + 5
- print(x)
- 10
我們可以這樣做:
- x = 5
- x += 5
- print(x)
當(dāng)然,這種操作符的使用取決于個人偏好。有些用戶可能更喜歡后一種方法,但在我個人看來,我總是發(fā)現(xiàn)加號等于運算符可以使這樣的表達(dá)式更加簡潔。
可變元組
您很可能熟悉Python中的元組和列表數(shù)據(jù)結(jié)構(gòu)。這是Python中兩種不同類型的可迭代一維數(shù)組,它們之間只有一個鍵差。元組是不可變的結(jié)構(gòu),這意味著一旦定義,元組就不能被更改。列表當(dāng)然是可變的,它包含了像append()這樣的方法。
雖然元組不是可變對象,但有一個關(guān)鍵的區(qū)別是許多程序員在觀察時忽略的。雖然元組本身可能不是可變的,但其中的類型仍然是可變的。元組仍然是一個數(shù)據(jù)結(jié)構(gòu),該元組中的數(shù)據(jù)仍然屬于其各自的類型。然而,Python仍然具有試圖改變不可變類型時可能會出現(xiàn)的拋出??紤]到這個功能,我們可以預(yù)期下面的代碼會顯示一個錯誤,說明元組是不可變的。
- z = (5, 10, 15)
- z[4] = 15
然而,為了證明元組中包含的數(shù)據(jù)仍然是可變的,如果我們要從元組中取出一些數(shù)據(jù),我們可以對它進(jìn)行修改:
- newnum = z[3]
- newnum = z[2]
- newnum += 5
- print(newnum)
- 20
考慮下面的列表元組:
- letters = (["S", "T"],
- ["A", "D"])
元組本身是一個不可變類型。但是,其中的列表,一個字母在字母L后面,另一個字母在字母L前面,仍然是可變的。如果我們現(xiàn)在試著在這張單子上再加一封信,你覺得會發(fā)生什么?
- letters[0] += "Q"
正如預(yù)期的那樣,我們得到了另一個類型錯誤,因為元組一旦創(chuàng)建就不能更改。但是,只有在對數(shù)據(jù)結(jié)構(gòu)調(diào)用操作符后才會拋出此類型錯誤。換句話說,我們可能遇到了異常,但如果我們現(xiàn)在從元組中打印出列表,我們將看到元素實際上已經(jīng)被添加到列表中:
- print(letters[0])
- ['S', 'T', 'Q']
需要注意的是,它不能直接處理數(shù)據(jù)類型。Python的有趣之處在于,在基類內(nèi)部的數(shù)據(jù)類型和我們可能在基類外部使用的數(shù)據(jù)類型之間基本上沒有關(guān)鍵區(qū)別。這意味著我們實際上可以用純Python重寫這些類型。這與大多數(shù)語言不同,后者通常包括在語言本身中沒有結(jié)構(gòu)化的基礎(chǔ)數(shù)據(jù)類型。
信不信由你,這種類型錯誤和元組可變性是Python的特性,而不是bug。乍一看,這里似乎犯了某種錯誤,但考慮到Python的方法學(xué),這一切在某種程度上確實是有意義的。這一切都與Python如何處理數(shù)據(jù)有關(guān),更重要的是,plus-equals如何處理不同的數(shù)據(jù)類型。這就是為什么正等號這么棒的部分原因!
仔細(xì)看看
現(xiàn)在我們已經(jīng)知道了加號等于運算符有多奇怪,為了更好地理解其用法中的怪異之處,讓我們來看看該運算符實際上是如何工作的。當(dāng)然,這將是這個操作符上相同函數(shù)的Python實現(xiàn)的一個更粗略的版本。代碼看起來就像我們期望的那樣:
- def plusequals(num1, num2):
- total = num1.__iadd__(num2)
- num1 = total
然而,每當(dāng)我們使用更大的表達(dá)式,而不是簡單的數(shù)據(jù)類型時,我們可以考慮代碼看起來更類似于以下內(nèi)容:
- def plusequals(x[0], element):
- total = x[0].__iadd__(element)
- x[0] = total
當(dāng)然,正如我們前面提到的,從元組中提取的元素完全可以添加元素。然而,當(dāng)我們將x的第一個(第0個)索引賦值給新的總數(shù)時,就會遇到元組的類型錯誤。
原文鏈接:
https://towardsdatascience.com/pythons-most-confusing-operator-96c67d6e661a