Python學習4(字典的記憶體分佈)
阿新 • • 發佈:2022-05-08
1、字典:是python資料型別之一,字典通過花括號來包含資料項,字典的每個元素由2個部分組成,鍵:值,字典是根據鍵來找對應的值。
data = {"name": "Ethon", "age": 12, "address": "Shen zhen"}
2、字典的特點:
-
字典與列表、集合一樣,都是屬於可變資料型別
-
字典和列表一樣,也能夠儲存多個數據
-
鍵物件具有唯一性,因此只有不可變資料型別(數字,字串和元組)才能作為鍵鍵物件
-
值物件可以為python的任意資料型別
3、字典的記憶體分佈
data = {"name": "Ethon", "age": 12, "address": "Shen zhen"} print(data) # {'name': 'Ethon', 'age': 12, 'address': 'Shen zhen'}
4、字典底層原理
字典物件的核心是散列表,散列表是一個稀疏陣列(總是有空白元素的陣列),陣列的每個單元叫做 bucket。每個 bucket 有兩部分:一個是鍵物件的引用,一個是值物件的引用。由於所有 bucket 結構和大小一致,我們可以通過偏移量來讀取指定 bucket。
4.1、鍵值的儲存過程
data = {} data["name"] = "Ethon" data["age"] = 12 data["address"] = "Shen zhen" print(bin(hash("name"))) # -0b110101010110011100010010100000011000110000001101000100000111101 print(bin(hash("age"))) # 0b1001111110011010111111111010000010110010101000011000011100 print(bin(hash("address"))) # 0b100011011010010101010010100001110110010101001101100010000110011
1.首先要計算data["name"]的雜湊值
2.得到hash值後,我們從hash值最右邊3位數字作為偏離量,即"101"
3.我們檢視偏移量"101" 對應的bucket是否為空,如果為空,則將鍵值對放進去
4.如果不為空,則依次去右邊3位作為偏離量,即111"
5.再看偏離量"111" 對應的bucket是否為空,直到找到為空的bucket將鍵值對放進去。
4.2、字典查詢值的過程
1.我們要計算data["name"] 裡面的"name"物件
2.確定偏離量,雜湊值的最右邊3位數字作為偏離量 "101"
3.檢視偏離量"101"對應的bucket是否為空,如果為空,則返回None
4.如果不為空,則將這個bucket的鍵物件計算出對應的雜湊值和data["name"]的"name"雜湊值進行比較,如果兩個雜湊值相等,則將對應數組裡的值物件返回,如果不相等,則再依次取其他幾位數字,重新計算偏離量。依次取完,仍然沒有找到,則返回None。