請務必注意,dict內部存放的順序和key放入的順序是沒有關係的。python
和list比較,dict有如下幾個特色:spa
而list相反:code
因此,dict是用空間來換取時間的一種方法。對象
dict能夠用在須要高速查找的不少地方,在Python代碼中幾乎無處不在,正確使用dict很是重要,須要牢記的第一條就是dict的key必須是不可變對象。內存
D = {'xiaoming':99,'xiaoqiang':100,'xiaozhu':88}ci
D['xiaozhu'] = 59
print(D['xiaozhu'])rem
print('xiaozhu' in D)字符串
print(D.get('xiao',-2))get
print(D.pop('xiaoqiang'))數學
print(D)
set和dict相似,也是一組key的集合,但不存儲value。因爲key不能重複,因此,在set中,沒有重複的key。
要建立一個set,須要提供一個list做爲輸入集合:
>>> s = set([1, 2, 3]) >>> s {1, 2, 3}
重複元素在set中自動被過濾:
>>> s = set([1, 1, 2, 2, 3, 3]) >>> s {1, 2, 3}
經過add(key)
方法能夠添加元素到set中,能夠重複添加,但不會有效果:
>>> s.add(4) >>> s {1, 2, 3, 4} >>> s.add(4) >>> s {1, 2, 3, 4}
經過remove(key)
方法能夠刪除元素:
>>> s.remove(4) >>> s {1, 2, 3}
set能夠當作數學意義上的無序和無重複元素的集合,所以,兩個set能夠作數學意義上的交集、並集等操做:
>>> s1 = set([1, 2, 3]) >>> s2 = set([2, 3, 4]) >>> s1 & s2 {2, 3} >>> s1 | s2 {1, 2, 3, 4}
上面咱們講了,str是不變對象,而list是可變對象。
對於可變對象,好比list,對list進行操做,list內部的內容是會變化的,好比:
>>> a = ['c', 'b', 'a'] >>> a.sort() >>> a ['a', 'b', 'c']
而對於不可變對象,好比str,對str進行操做呢:
>>> a = 'abc' >>> a.replace('a', 'A') 'Abc' >>> a 'abc'
雖然字符串有個replace()
方法,也確實變出了'Abc'
,但變量a
最後還是'abc'
,應該怎麼理解呢?
咱們先把代碼改爲下面這樣:
>>> a = 'abc' >>> b = a.replace('a', 'A') >>> b 'Abc' >>> a 'abc'
要始終牢記的是,a
是變量,而'abc'
纔是字符串對象!有些時候,咱們常常說,對象a
的內容是'abc'
,但實際上是指,a
自己是一個變量,它指向的對象的內容纔是'abc'
:
┌───┐ ┌───────┐ │ a │─────────────────>│ 'abc' │ └───┘ └───────┘
當咱們調用a.replace('a', 'A')
時,實際上調用方法replace
是做用在字符串對象'abc'
上的,而這個方法雖然名字叫replace
,但卻沒有改變字符串'abc'
的內容。相反,replace
方法建立了一個新字符串'Abc'
並返回,若是咱們用變量b
指向該新字符串,就容易理解了,變量a
仍指向原有的字符串'abc'
,但變量b
卻指向新字符串'Abc'
了:
┌───┐ ┌───────┐ │ a │─────────────────>│ 'abc' │ └───┘ └───────┘ ┌───┐ ┌───────┐ │ b │─────────────────>│ 'Abc' │ └───┘ └───────┘
因此,對於不變對象來講,調用對象自身的任意方法,也不會改變該對象自身的內容。相反,這些方法會建立新的對象並返回,這樣,就保證了不可變對象自己永遠是不可變的。