'==' 判斷兩邊內容是否相等python
'is' 基於內存地址進行判斷是否相同面試
a = 10 b = 10 print(a == b ) #is print(a is b)
小數據池的數字範圍: -5 ~256緩存
a = -5 b = -5 c = -5 print(id(a)) print(id(b)) print(id(c)) #<-5不行 a = -6 b = -6 print(id(a)) print(id(b)) a = 256 b = 256 print(id(a)) print(id(b)) #>256能夠,可是不是小數據池,是python的代碼塊 a = 257 b = 257 print(id(a)) print(id(b))
支持:一個文件,一個函數,一個類,一個模塊,終端的每一行是一個代碼塊app
a = -2.5 * 1 b = -2.5 * 1 print(id(a)) print(id(b))
在同一代碼塊下,只要內容相同,就採用相同的內存地址函數
*作乘法的時候總長度不能超過20(python4.7版本到4096)code
乘法的時候中文,特殊符號乘以1或0blog
a = "alex你好" *2 b = "alex你好" *2 print(id(a)) print(id(b))
在同一代碼塊下,只要內容相同,就採用相同的內存地址索引
範圍*-5 ~256內存
在同一代碼塊下,只要內容相同,就採用相同的內存地址rem
小數據池的驗證方法:必須脫離代碼塊才能驗證(在Windows cmd下驗證)
python規則:先執行代碼塊的規則,在執行小數據池的規則 --(駐留機制)
面試必問:賦值,淺拷貝,深拷貝
1.淺拷貝 -- 拷貝第一層元素內存地址,修改第一層元素的時候新拷貝的列表不進行改變 2.深拷貝 -- 不可變的數據類型共用,可變數據類型開闢一個新的空間,新的空間中的元素若是是不可變類型也是共用 3.賦值 -- 多個變量名指向同一個內存地址
import copy v1 = "alex" v2 = copy.copy(v1) v3 = copy.deepcopy(v1) print(v1 is v2)#結果:True print(v1 is v3)#結果:True v1 = [1,2,3] v2 = copy.copy(v1) v3 = copy.deepcopy(v1) print(v1 is v2)#結果:False print(v1 is v3)#結果:False
多個變量名指向同一個內存地址
#1.賦值 lst = [1,2,3,[5,6,7]] lst1= list2 print(lst) print(lst1) #賦值後,一個操做,兩個全變,內存地址相同 lst1[-1].append(8) print(lst) print(lst1) print(id(lst),id(lst1))
*淺拷貝的時候,只會開闢一個新的容器列表,其餘元素使用的都是源列表中的元素
lst = [1,2,3,[6,5,7]] lst1 = lst.copy()#新開闢一個空間給lst1 print(lst) print(lst1) print(id(lst),id(lst1))#結果:46646536 46647136 #操做1.修改第二層數據,原列表也變 lst1[-1].append(8) print(lst1)#結果:[1, 2, 3, [6, 5, 7, 8]] print(lst)#結果:[1, 2, 3, [6, 5, 7, 8]] #操做2.修改第一層數據,原列表不變 lst = [1,2,3,[5,6,7]] lst1 = lst.copy() lst1[3] = 567 print(lst1)#結果:[1, 2, 3, 567] print(lst)#結果:[1, 2, 3, [6, 5, 7]] #操做3.修改第三層數據,原列表也變 lst = [1,2,3,4,[5,6,7,[8,9]]] lst1 = lst.copy() lst1[-1][-1] = "56" print(lst)#結果:[1, 2, 3, 4, [5, 6, 7, '56']] print(lst1) #結果:[1, 2, 3, 4, [5, 6, 7, '56']] #操做4.注意,字典的值整個就算爲第一層數據,裏面的任意都不僅是第一層數據 dic = {"alex":[1,2,3,[5,6]]} dic1 = dic.copy() dic["alex"] = "56" print(dic)#結果:{'alex': '56'} print(dic1)#結果:{'alex': [1, 2, 3, [5, 6]]} dic["alex"][0] = "56" print(dic)#結果:{'alex': ['56', 2, 3, [5, 6]]} print(dic1)#結果:{'alex': ['56', 2, 3, [5, 6]]}
不管怎樣改變新拷貝的數據,原數據都不會改變。
開闢一個容器空間,不可變數據類型(第一層元素)共用同一內存地址,共用值,可變數據類型(非第一層)在開闢一個新空間(新的內存地址),可是裏面的值是共用的
import copy lst = [1,2,3[6,5,7]] lst1 = copy.deepcopy(lst) lst1[-1].append(8) print(lst) print(lst1) #修改非第一層數據,原數據不變 lst1[0] = 88 print(lst) print(lst1) #修改第一層數據,原數據不變 print(id(lst[0]))#結果:494255688 print(id(lst1[0]))#結果:494255688 #第一層是同一內存地址 print(id(lst[-1]))#結果:43102336 print(id(lst1[-1]))#結果:43321264 #非第一層是不一樣的內存地址,可是非第一層內層的值內存地址相同。 print(id(lst[-1][0]))#結果:503627400 print(id(lst[-1][0]))#結果:503627400
沒有值的字典,無序 - - 不支持索引,
*自然去重
定義:
s = {1,"alex",False,(1,2,3),12,15,1,1,2,12}#列表不能夠做爲元素 #面試題: list1 = [1,2,1,21,21,2,1,212,1,1] print(list(set(list1)))
s = {1,2,3,4} s.add("67") #只能添加一個 print(s) s.update("今天")#迭代添加 print(s)
s = {1,2,3,4} s.pop()#有返回值,隨機刪除 print(s) print(s.pop) s.remove(3)#指定元素刪除 print(s) s.clear() print(s)#集合 set()
先刪再增
for 循環
s = {1,2,3,4} for i in s: print(i)
s1 = {1,2,3,4,5,6,6,7} s2 = {5,6,7,1,9} print(s1 & s2) #交集。結果:{1, 5, 6, 7} print(s1 | s2) #並集,可去重。結果:{1, 2, 3, 4, 5, 6, 7,9} print(s1 - s2) #差集。結果:{2, 3, 4} print(s1 ^ s2) #反交集。結果:{2, 3, 4, 9} print(s1 > s2) #父集(超集)。結果:False print(s1 < s2) #字跡。結果:False #凍結集合,很不經常使用,也沒什麼用,使此集合不可更改 print(frozenset(s1))#結果:frozenset({1, 2, 3, 4, 5, 6, 7}) dic = {frozenset(s1):1} print(dic)#結果:{frozenset({1, 2, 3, 4, 5, 6, 7}): 1}