1 對於賦值運算,就是共同指向一個內存地址.將一個值賦予一個變量,那麼它的內存地址同時也賦予了他,若是值是不可變類型,改變值,就會產生一個新值和新內存地址,
若是值是可變類型那麼內存地址不會變.
s1 = 'alex' s2 = s1 print(s1,id(s1)) print(s2,id(s2))
結果:面試
當值是可變類型時app
s1 = [] s2 = s1 s2.append("a") print(s1,id(s1)) print(s2,id(s2))
結果:
2 淺層copy 拷貝第一層的數據獨立,第二層及之後公用一個內存地址測試
#copy l1 = [1,2,3] l2 = l1.copy() l1.append(666) #在第一層裏添加數據 print(l1,id(l1)) print(l2,id(l2)) l1 = [1,[22,33],2,3] l2 = l1.copy() l1[1].append(666) #在第二層添加數據 print(l1,id(l1)) print(l2,id(l2))
結果:spa
3 深層copy 要引用模塊 import copy 對於深copy,不管多少層,在內存中都是兩個獨立的內存地址3d
import copy l1 = [1,[22,33,],2,3] l2 = copy.deepcopy(l1) l1.append(777) l1[1].append(666) print(l1,id(l1),id(l1[1])) print(l2,id(l2),id(l2[1]))
結果:code
4 面試題blog
l1 = [1,[1,2],2,3] l2 = l1[:] # 是淺copy l1[1].append(111) print(l1,l2) #l2 是什麼?
結果:索引
5 在列表循環過程當中,若是刪除數據,可能會報錯,舉例:內存
將下列數據中奇數位刪掉rem
#方法一: l1 = [111,222,333,444,555] # 刪掉奇數就是保留偶數,將偶數數據找到,建個新列表代替原來列表 l2 = [] for i in range(len(l1)): if i % 2 == 0: l2.append(l1[i]) l1 = l2 print(l1) #方法二: l1 = [111,222,333,444,555,666,777] # 經過切片的步長刪掉奇數數據 del l1[1::2] print(l1)
#方法三 l1 = [111,222,333,444,555] # 將索引倒序找奇數位 這樣刪掉數據就不會影響前面元素的索引 for i in range(len(l1)-1,-1,-1): if i % 2 == 1: del l1[i] print(l1)
結果:
6 字典在循環過程當中,若是刪掉數據也會報錯
dic = {'k1':'alex','k2':'太白','k3':'日天','name':'wusir'} #不可變的數據類型:可哈希 # for i in dic: # if 'k' in i: # del dic[i] print(dic)
結果: 在迭代過程當中字典大小改變
對應方法dic = {'k1':'alex','k2':'太白','k3':'日天','name':'wusir'}
l1 = [] for i in dic:
if 'k' in i:
l1.append(i) for k in l1:
del dic[k]
print(dic)
結果; 在字典循環中不能改變字典,可是新建個列表,把要刪除的數據放到列表裏,在循環列表,再循環列表過程當中修改字典就不會報錯.
7 數據類型轉換 元祖變列表list(tuple) 列表變元祖 tuple(list)
#tuple <---> list l1 = [1,2,3] tu = tuple(l1) #將列表換成元祖 l2 = list(tu) #將元祖變成列表 print(tu,l2)
結果:
字典專屬類型轉換 能夠變列表,元祖 可是元祖是不可變類型 通常轉換成列表
dic = {'k1':'alex','k2':'太白','k3':'日天','name':'wusir'} print(list(dic.keys())) print(list(dic.values())) print(list(dic.items()))
結果:
8 集合
集合是無序的,不重複的數據集合,它裏面的元素是可哈希的(不可變類型),可是集合自己是不可哈希(因此集合作不了字典的鍵)的。
如下是集合最重要的兩點:
去重,把一個列表變成集合,就自動去重了。
關係測試,測試兩組數據以前的交集、差集、並集等關係。
9 集合的增。
set1 = {'alex','wusir','ritian','egon','barry'} set1.add('景女神') print(set1) #update:迭代着增長 set1.update('景女神') print(set1)
結果:
10 集合的刪。
set1 = {'alex','wusir','ritian','egon','barry'} set1.remove('alex') # 刪除一個元素 print(set1) set1.pop() # 隨機刪除一個元素 print(set1) set1.clear() # 清空集合 print(set1) del set1 # 刪除集合 print(set1)
結果:
11 集合的交 並,反交 差集,超集和子集
交集 (& 或者 intersection)
set1 = {1,2,3,4,5} set2 = {4,5,6,7,8} print(set1 & set2) # {4, 5} print(set1.intersection(set2)) # {4, 5}
結果:
並集。(| 或者 union)
set1 = {1,2,3,4,5} set2 = {4,5,6,7,8} print(set1 | set2) # {1, 2, 3, 4, 5, 6, 7} print(set2.union(set1)) # {1, 2, 3, 4, 5, 6, 7}
結果:
差集。(- 或者 difference)
set1 = {1,2,3,4,5} set2 = {4,5,6,7,8} print(set1 - set2) # {1, 2, 3} print(set1.difference(set2)) # {1, 2, 3}
結果:
反交集。 (^ 或者 symmetric_difference)
set1 = {1,2,3,4,5} set2 = {4,5,6,7,8} print(set1 ^ set2) # {1, 2, 3, 6, 7, 8} print(set1.symmetric_difference(set2)) # {1, 2, 3, 6, 7, 8}
結果:
子集與超集
set1 = {1,2,3} set2 = {1,2,3,4,5,6} print(set1 < set2) print(set1.issubset(set2)) # 這兩個相同,都是說明set1是set2子集。 print(set2 > set1) print(set2.issuperset(set1)) # 這兩個相同,都是說明set2是set1超集。
結果:
frozenset不可變集合,讓集合變成不可變類型。把一個可迭代的元素添加到集合 若是有重複元素,自動刪掉.
s = frozenset('barry') print(s,type(s)) # frozenset({'a', 'y', 'b', 'r'}) <class 'frozenset'>
結果: