天天看點

Python學習之字典字典的常見用法Python字典複制(淺拷貝and深拷貝)

字典的常見用法

'''  字典正确使用方法  '''
# 建立空字典
dict0 = {}

# 建立非空字典
dict1 = {'name':'Jane', 'age':26, 'sex':'female'}

# 新增鍵值對
dict1['address'] = '深圳市南山區義學街四坊五号'

# 修改鍵值對 # 同一個鍵不允許出現兩次,後一個值會被記住,覆寫前一個值
dict1['name'] = 'Smith'

# 删除鍵'name'
del dict1['name']

# 清空字典
dict1.clear()

# 删除字典
del dict1


'''  字典錯誤使用方法  '''
# 鍵使用清單 # ['name']為清單,字典中不能使用清單作為鍵,可以使用“字元串、數字、元組”作為鍵
dict2 = {['name']:'Jane', 'age':26, 'sex':'female'}


'''  字典内置函數及方法  '''
# len(dict) 擷取字典長度,一個鍵值對表示一個長度
print(len(dict1))   # 列印結果:4

# str(dict1) 将字典轉化為字元串表示
print(str(dict1))   # 列印結果:{'name': 'Smith', 'age': 26, 'sex': 'female', 'address': '深圳市南山區義學街四坊五号'}

# type(dict) 傳回變量類型
print(type(dict1))  # 列印結果:<class 'dict'>

# dict.copy() 淺複制字典 # 開辟一塊記憶體空間,将值拷貝進去,二者id位址不同
dict1_copy = dict1.copy()
print('id(d):', id(dict1_copy))   # 列印結果:2589300137088
print(id(dict1))   # 列印結果:2589300283904

# dict.fromkeys(seq[, value]) # 建立一個新字典,以序列seq中元素做字典的鍵,val為字典所有鍵對應的初始值。
# seq:字典鍵值清單(即指字典變量)
# value:可選參數,設定鍵序列(seq)對應的值,預設為None。
# 傳回一個新的字典
newDict = dict.fromkeys(dict1)  # 列印結果:{'name': None, 'age': None, 'sex': None, 'address': None}
dict.fromkeys(dict1, 10)  # 列印結果:{'name': 10, 'age': 10, 'sex': 10, 'address': 10}

# dict1.get(key, default=None) 傳回指定的鍵值
dict1.get('age')

# key in dict 判斷鍵在字典裡則傳回true,不在則傳回false
if 'name' in dict1:
    print('yes')
else:
    print('no')

# dict1.items() 以清單傳回一個視圖對象
dict2 = dict1.items()  # 列印結果:dict_items([('name', 'Smith'), ('age', 26), ('sex', 'female'), ('address', '深圳市南山區義學街四坊五号')])

# dict1.keys() 傳回鍵集合的視圖對象
dict3 = dict1.keys()   # 列印結果:dict_keys(['name', 'age', 'sex', 'address'])

# d.update(d2) 把字典d2的鍵/值對更新到d裡
d = {'Name': 'Runoob', 'Age': 7}
d2 = {'Sex': 'female' }
d.update(d2)    # 列印結果:{'Name': 'Runoob', 'Age': 7, 'Sex': 'female'}

# dict1.values() 傳回字典所有值的集合清單
DValue = dict1.values()     # 列印結果:dict_values(['Smith', 26, 'female', '深圳市南山區義學街四坊五号'])

# pop(key[,default]) 删除字典給定鍵 key 所對應的值,傳回值為被删除的值。key:要删除的值。default:如果沒有key,傳回default值
deleteKey = dict1.pop('name', 'not find')   # 列印結果:Smith

# popitem() 随機傳回并删除字典中的最後一對鍵和值
dleteLast = dict1.popitem()     # 列印結果:('address', '深圳市南山區義學街四坊五号')

print(dleteLast)
           

Python字典複制(淺拷貝and深拷貝)

先建立一個字典并初始化資料

使用指派法進行複制——深拷貝

d1 = d
           

疑問:Python中這種指派方法複制的d1,是位址引用呢還是開辟一塊記憶體空間進行值拷貝?

解析:想知道是引用同一塊記憶體位址還是另開辟一塊記憶體空間拷貝資料,可以先通過代碼看變量的位址id是不是一樣的。

d = {'age':25, 'name':'song'}
d1 = d
d1['age'] = 21
print('id(d): ', id(d))
print('id(d1): ', id(d1))
print('d['age']: ', d['age'])
print('d1['age']: ', d['age'])
           

列印結果:

id(d): 1768306039104
id(d1):1768306039104
d['age']:21
d1['age']:21
           

這說明d1與d都是指向同一塊記憶體位址,d1引用了d的記憶體位址,它們指向的是同一個東西。再來一個記憶體位址圖更容易懂

Python學習之字典字典的常見用法Python字典複制(淺拷貝and深拷貝)

使用函數 copy()進行複制——淺拷貝

copy()方法則是淺複制,代碼執行個體:

d = {'age':25, 'name':'song'}
d1 = d.copy()
d1['age'] = 21
print('id(d): ', id(d))
print('id(d1): ', id(d1))
print('d['age']: ', d['age'])
print('d1['age']: ', d['age'])
           

執行後列印結果:

id(d): 1768306039104
id(d1):1768305896320
d['age']:25
d1['age']:21
           

d與d1的記憶體位址不同,d1修改了age,而d的age值仍未變,說明copy函數是開辟空間拷貝的值。

Python學習之字典字典的常見用法Python字典複制(淺拷貝and深拷貝)