深拷貝和淺拷貝python
列表的拷貝,用copy方法淺拷貝,新列表和被拷貝列表的id是不同的。函數
list1 = [1, 'ss', (5, 6), ['p', 'w','M'], {'key1': 'value1', 'key2':'value2'}] print('list1', id(list1)) # list1 1964077175880 list2 = list1.copy() print('list2', id(list2)) # list2 1964333005960
淺拷貝以後,若是在新的列表中改變可變元素,會同步影響被拷貝列表中對應的元素,二者聯動編碼
若是在新列表中改變不可變元素,新老列表不會同步變化spa
list1 = [1, 'ss', (5, 6), ['p', 'w','M']] print('list1', id(list1)) # list1 2443199403080 list2 = list1.copy() print('list2', id(list2)) # list2 2443455166280 list2[3][1] = 'qqqqqq' # 對list2中第四個元素進行修改 list2[2] = ('x', 'y') print('list1第四個元素id', id(list1[3])) # list1第四個元素id 2443199402568 print('list1第一個元素id', id(list1[0])) # list1第一個元素id 140729573994768 print(list1) # [1, 'ss', (5, 6), ['p', 'qqqqqq', 'M']] print('list2第四個元素id', id(list2[3])) # list2第四個元素id 2443199402568 print('list2第一個元素id', id(list2[0])) # list2第一個元素id 140729573994768 print(list2) # [1, 'ss', ('x', 'y'), ['p', 'qqqqqq', 'M']]
深拷貝須要import copy的包,使用其中的deepcopy函數3d
深拷貝以後,新舊列表毫無瓜葛,就是徹底不相關的兩個列表。code
深拷貝以後,列表中可變元素的id不同,不可變元素的id是同樣的。對象
import copy list1 = [1, 'ss', (5, 6), ['p', 'w','M']] list2 = copy.deepcopy(list1) print('list1', id(list1)) # list1 1665335972936 print('list2', id(list2)) # list2 1665620498440 list2[3][1] = 'qqqqqq' print(list1) # [1, 'ss', (5, 6), ['p', 'w', 'M']] print(list2) # [1, 'ss', (5, 6), ['p', 'qqqqqq', 'M']] print('list1第四個元素id', id(list1[3])) # list1第四個元素id 1665335972424 print('list2第四個元素id', id(list2[3])) # list2第四個元素id 1665365546952
文件的編碼blog
在電腦中執行程序的過程圖片
一、硬盤的內容加載到內存內存
二、CPU去內存中取數據,執行程序。
三、執行生成的數據,優先存入內存。
python解釋器在計算機中的運行過程
一、python解釋器代碼由硬盤加載到內存
二、文件從硬盤加載到內存
三、解釋器讀取文件內容
四、識別python語法,執行操做
ASCII碼 一個字節表明一個英文字母
GBK碼 兩個字節表明一箇中文
utf-8碼 一個字節表明英文,3個字節表明漢字
utf-8只和Unicode作映射,其餘編碼必須先轉成unicode,才能夠轉成utf-8
目前,計算機內存中均是Unicode,硬盤中均是utf-8
字節byte,一個字節由8個bit組成。
編碼的過程,由字符轉爲字節流 encode
解碼的過程,由字節流轉爲字符 decode
用什麼格式編碼,就要用什麼格式解碼
unicode(內存) ---> 編碼encode---> utf-8(硬盤)
utf-8(硬盤)---> 解碼decode---> unicode (內存)
打開文件的三種模式
一、 r模式,
只讀,若是文件不存在的話會報錯
二、w模式
只寫,若是文件不存在,則建立一個文件,將內容寫入
若是文件存在,則會先將文件裏的內容清空,再將內容寫進去
三、a模式
若是文件存在,則再內容後面追加內容
若是文件不存在,則建立一個文件,將內容寫入
打開文件的語法格式:
with open(r‘帶後綴的文件名’,mode=‘打開模式’,encoding='文件的編碼格式')as f :
r : 用來轉義‘帶後綴的文件名’路徑中的轉義字符
帶後綴的文件名 :能夠是絕對路徑,也能夠是相對路徑
文件編碼格式 : 與打開的文件編碼模式一致便可
f :文件對象的建成,便於後面使用
舉例說明:
with open(r'RECORD.txt', 'w', encoding='utf-8') as wf: wf.write('AAAAAAA') # AAAAAAA with open(r'RECORD.txt', 'a', encoding='utf-8')as af: af.write('BBBBB') # AAAAAAABBBBB
也能夠同時打開兩個文本文件,一個只讀一個只寫
with open(r'RECORD.txt', 'r', encoding='utf-8') as rf, \ #r默認的時rt,讀文本文件的 open(r'newRecord.py', 'w', encoding='utf-8')as wf: a = rf.read() # 打開RECORD.txt文件 wf.write(a) # 將RECORD.txt文件寫入newRecord.py
打開圖片等非文本文件,拷貝的時候不要指定encoding參數。
with open(r'th.jpg', 'rb') as rf, open(r'newPhoto.png', 'wb')as wf: #rb用於讀byte文件的 sss = rf.read() wf.write(sss)