先執行**塊,然後小資料池!
****塊機制內容:python在執行同乙個**塊的初始化物件的命令時,會檢查是否其值是否已經存在,如果存在,會將其重用。換句話說:執行同乙個**塊時,遇到初始化物件的命令時,他會將初始化的這個變數與值儲存在乙個字典中,在遇到新的變數時,會先在字典中查詢記錄,如果有同樣的記錄那麼它會重複使用這個字典中的之前的這個值。所以在你給出的例子中,檔案執行時(同乙個**塊)會把i1、i2兩個變數指向同乙個物件,**滿足快取機制則他們在記憶體中只存在乙個,即:id相同。
****終端中測試的是小資料池快取機制:
數字: -5 ~ 256
字串:
定義時內容(除去中文,特殊符號)長度不限,內容相同,就進行駐留。
python 3. 6直譯器字串進行乘法時(不能有中文和特殊符號),總長度不能超過20
python 3. 7直譯器字串進行乘法時(不能有中文和特殊符號),總長度不能超過4096
****pycharm 中測試的是**塊的快取機制:
數字: -5 ~ 正無窮
字串:
定義時內容長度不限,內容相同,就進行駐留
字串進行乘法時(不能有中文和特殊符號),總長度不能超過20
賦值操作
lst = [1,2,3] # 可變資料型別
lst1 = lst
print(lst,lst1) # lst賦值給了lst1 共用一塊記憶體空間,故lst 新增,lst1也新增
輸出結果 [1,2,3,4] [1,2,3,4]
# 總結: 多個變數指向同乙個記憶體位址,如果這個記憶體位址的資料是
# 修改時不可變的資料型別時,會新開闢空間(字串,數字)
# 修改時可變的資料型別時,會在原地進行修改(列表,字典)
淺拷貝淺拷貝只把原列表中記錄的記憶體位址拿到乙個新開闢的列表中為了更好理解,看例子上圖!
lst = [1,2,3,[6,7,8]]
# lst2 = lst[:] # 淺拷貝
圖中橙色的是新開闢的空間,淺藍色的是數字型別,紅色的列表型別
我們修改成字串"22" 就是在列表中將以前的記憶體位址更換成新開闢的空間位址
淺拷貝總結:淺拷貝只開闢最外層空間,其中元素的記憶體位址都是一樣的,就是共用,當不可變資料型別,像int,str,bool這些元素新增或刪除或修改的時候都不會互相影響,因為他們需要自行開闢空間,而可變資料型別,修改或新增或刪除不需要從新開闢空間,在自己的空間內增刪改,所以原拷貝物件變化,拷貝的物件也會變化。
深拷貝
深拷貝:深拷貝不可變元素共用,若各自修改都需自己開闢空間,不會一同改變,假如lst中1需要刪除,他的記憶體位址會刪,但是lst2複製的記憶體位址還是指向1,不會改變,可變資料型別中裡面的元素共用,導致各自改變各自的列表內元素,相互不會受到影響,並且列表空間位址不一樣,所以各自更改元素受影響的只是自己列表位址空間中的元素而已,不會受到影響!
python小資料池
name jerry print id name is 是什麼?又是什麼?是比較的兩邊的數值是否相等,而 is 是比較的兩邊的記憶體位址是否相等。python程式是由 塊構造的。塊是乙個python程式的文字,他是作為乙個單元執行的。塊 乙個模組,乙個函式,乙個類,乙個檔案等都是乙個 塊。pytho...
Python基礎6 小資料池,編碼補充
一.小資料池 塊 python程式是有 塊構成的,乙個 塊的文字作為python程式的執行單元.乙個模組,乙個函式,乙個類,甚至每乙個command命令都是乙個 塊,乙個檔案也是乙個 塊.eval 和exec 執行的時候也是乙個 塊 命令列 我們在控制台cmd中輸入的python進入的就是pytho...
Python細節 二 小資料池
python是由 塊構成的 塊,乙個模組.乙個函式,乙個類,乙個檔案,eval exec 執行的時候也是乙個 塊 1.記憶體位址 id 通過id 我們可以檢視到乙個變數表示的值在記憶體中的位址 a alex print id a 4541631158 和is 比較的是值 內容 true is比較的是...