為什么要創(chuàng)造一個和列表差別不大的容器類型?
元組和列表看起來不同的一點是元組用圓括號而列表用方括號。而最重要的是,元組是不可變類型。這就保證了元組的安全性。
創(chuàng)造元組給它賦值和列表完全一樣。除了一個元素的元組要在元組分割符里加一個逗號以防跟普通的分組操作符混淆。
>>> aTuple = (1)>>> aTuple1>>> aTuple = (1,)>>> aTuple(1,)
訪問元組的值和列表也一樣。
更新元組和更新字符串一樣,要再構造一個新字符串,刪除一個單獨的元組元素以不可能的。只能顯式地刪除一整個元組,當然我們并不需要這么做。
元組和列表一樣也沒有自己專用的運算符和內(nèi)建函數(shù)。因為元組本身是不可變的,所以這些操作對元組來說就是多余的,沒有什么意義。
元組的特殊特性
元組的不可變導致我們不能改變其中的一個或多個元素,這樣在我們傳遞數(shù)據(jù)給一個不了解的API時,可以保證我們的數(shù)據(jù)不會被修改。
而當我們需要操作從一個函數(shù)返回的元組時,可以用list()函數(shù)把它轉換成一個列表。
元組的不可變也不是那么的不可變,我們可以像操作字符串一樣連接、重復等等操作。還有是,雖然元組對象本身是不可變的,但是不代表它包含的可變對象是不可變的,比如說元組里存在數(shù)組:
>>> t = (['xyz', 123], 23, -103.4)>>> t(['xyz', 123], 23, -103.4)>>> t[0][1]123>>> t[0][1] = ['abc', 'def']>>> t(['xyz', ['abc', 'def']], 23, -103.4)
所有的多對象的,逗號分隔的,沒有明確用符號定義的等等這些集合的默認類型都是元組。
>>> 'abc', -4.24e93, 18+6.6j, 'xyz'('abc', -4.24e+093, (18+6.6j), 'xyz')>>>>>> x, y = 1, 2>>> x, y(1, 2)
同樣的,所有函數(shù)返回的多對象,不包括有符號封裝的,都是元組。
作為字典的關鍵字
不可變對象的值不可變,意味著通過hash算法得到的值總是一個值。這是作為字典鍵值的必要條件。
拷貝Python對象
淺拷貝和深拷貝
淺拷貝的意思是創(chuàng)建一個和原對象一樣的對象類型,其內(nèi)容是原對象的引用。如下:
>>> person = ['name', ['savings', 100.0]]>>> hubby = person[:]>>> origin = ['abc',['def',12.3]]>>> copy1 = origin[:]>>> copy2 = list(origin)>>> [id(x) for x in origin, copy1, copy2][47106648, 47107008, 47104328]>>> [id(x) for x in origin[0], copy1[0], copy2[0]][4172448, 4172448, 4172448]
而因為我們是在淺拷貝,改變其中一份拷貝并不會影響另一份
>>> copy1[0] = 'change'>>> copy1['change', ['def', 12.3]]>>> copy2['abc', ['def', 12.3]]
與之相對的就是深拷貝:
>>> origin = ['abc',['def',12.3]]>>> copy1 = origin>>> copy2 = origin>>> copy1[0] = 'change'>>> copy1['change', ['def', 12.3]]>>> copy2['change', ['def', 12.3]]
深拷貝的id指向了同樣的量
>>> [id(x) for x in origin, copy1, copy2][47106648, 47106648, 47106648]
深淺拷貝還可以通過copy模塊里的函數(shù)實現(xiàn),copy.copy()是淺拷貝,copy.deepcopy()是深拷貝。
新聞熱點
疑難解答