感受好快呀,不知不覺已經到了第6天,就有一個感受就是,看視頻很爽,可是寫總結+代碼就累。因此就能夠看出一個問題,總結是頗有用的。html
不說了,如今都快9點了,博客還沒寫,抓緊寫,要睡覺了。python
總結總結:面試
今天學習了代碼塊、Python 的緩存機制、深淺拷貝。其中深淺拷貝是最重要的。緩存
Python 的代碼緩存機制超級重要,對理解深淺拷貝相當重要。Python 的代碼緩存機制通常有兩種方式,一種是同一代碼塊中,另外一種是不一樣代碼塊中。app
同一代碼塊:指的的是一個模塊、一個文件、一個類均可以叫作同一代碼塊。其緩存指的是全部整數、布爾值、以及幾乎所有的字符串,只要值相同,就不在重複建立存儲空間。函數
# 一、同一代碼塊中 # 字符串 name = "wang" name2 = "wang" # 整數 age = 18 age2 = 18 # 布爾 is_study = True is_study2 = True print(name is name2) # True print(age is age2) # True print(is_study is is_study2) # True
從上面能夠看出,全部的int、bool以及幾乎全部的字符串都作了緩存優化。除了這三種其餘的數據類型均不進行緩存。學習
不一樣代碼塊:通常稱之爲小數據池,好比你在終端中敲的一行一行的代碼,就屬於不一樣代碼塊。緩存從-5~255的整型、bool、以及知足條件的字符串。優化
在後面的深淺拷貝,你就會深入理解緩存機制。spa
id 是取出存儲數據的內存地址號code
# 一、id是取出存儲數據的內存地址號 age = 18 name = "zhang" print(id(name)) # 140360327550384 print(id(age)) # 4548361408
# 二、is 的做用是判斷二者的內存地址是否相同。能夠認爲是 id name2 = name name3 = "zhang" print(name2 is name) # True print(name3 is name) # True print(name3 == name) # True """ 一、解釋下爲何name3和name的存儲地址同樣呢? 緣由就是Python的緩存機制,在同一代碼塊下,int 、bool、大部分的str,變量的值相同的話,都是指向同一個存儲地址上。說白了就是節省開銷。 而name2和name相同,屬於淺拷貝,不難理解,至關因而引用。 二、== 的做用是? == 是判斷兩端的數據是否相同,而is是判斷存儲數據的地址是否同樣(地址同樣,數據是必然同樣的)。 """
== 是判斷兩端的數據值是否相同,而 is 是判斷存儲數據的存儲地址是否同樣(地址同樣,數據是必然同樣的)。
# 二、== name1 = "tree" name2 = "tree" print(name1 == name2) # True
深淺拷貝的概念很重要,必需要搞懂,不然你會很糊的。尤爲是面試的時候,須要手寫答案。
# 一、「引用」 至關因而從新定義一個變量 但指向同一個列表地址,說白了就是換了個皮。 s1 = [1, 2, [3, 4]] s2 = s1 s1[-1].append(5) s2.append(666) print(s1, s2) # [1, 2, [3, 4, 5], 666] [1, 2, [3, 4, 5], 666] # 從結果會發現,s1和s2一毛同樣,引用的是同一個內存地址
淺拷貝以後,其成員不建立新的存儲空間,和原成員共用一個。
# 二、淺拷貝 import copy s1 = [1, 2, [3, 4]] s2 = copy.copy(s1) s1.append(666) s2[-1].append(5) print(s1, s2) # [1, 2, [3, 4, 5], 666] [1, 2, [3, 4, 5]] # 分析:
一、s2 對 s1 進行了淺拷貝,拷貝的僅僅是各成員的的存儲地址(至關因而引用),並未複製一份新的存儲空間存放個成員。
因此當對 s1 進行追加 666 時,在 s1 中添加了一個666的存儲地址。而 s2 中並無,全部沒有666。
二、s1內部有一個列表(設:l1)變量(屬於可變數據類型),當淺拷貝時僅僅是拷貝這個列表的內存地址,並未複製一份新的存儲空間存放此列表l1。
因此當對 s2 的最後一個元素進行追加 5 時,s1 和 s2 都指向 l1 地址。
因此當
能夠看下面這張圖
成員爲不可變數據類型的值,不建立新的存儲空間,共用一個。可變的數據類型,複製一份新的,開闢新的存儲空間。
說下深拷貝的適用場景,主要用於爲了防止複製出來的對象,對原對象形成改變。
import copy # 深拷貝,沒啥好說的,直接複製一份一毛同樣的,彼此之間沒有影響 s1 = [1, 2, [3, 4]] s2 = copy.deepcopy(s1) s1.append(666) s2[-1].append(5) print(s1, s2) # [1, 2, [3, 4], 666] [1, 2, [3, 4, 5]] # 代碼緩存的問題 作題的坑 s1 = [1, 2, [3, 4]] s2 = copy.deepcopy(s1) print(s1[0] is s2[0]) print(s1[-1] is s2[-1]) print(s1[-1][0] is s2[-1][0]) # 測測你會答對了幾個? """ True False True """
深度拷貝的題:
# 代碼緩存的問題 作題的坑 s1 = [1, 2, [3, 4]] s2 = copy.deepcopy(s1) print(s1[0] is s2[0]) print(s1[-1] is s2[-1]) print(s1[-1][0] is s2[-1][0]) # 測測你會答對了幾個? """ True False True """
淺拷貝的題:
# 二、淺拷貝題 s1 = [1, 2, [3, 4]] s2 = copy.copy(s1) print(s1[0] is s2[0]) print(s1[-1] is s2[-1]) print(s1[-1][0] is s2[-1][0]) # 測測你會答對了幾個? """ True True True """
寫了 6 天的項目,才補的 day06 的博客,手動後悔中,明天開始正常看視頻+寫博客中。另外明天開啓一天學兩天的課模式,節省時間,要給後面學習 Java 騰時間。
參考文章: