今日內容
- 深淺拷貝(面試)
- 檔案操作
今日內容
-
深淺拷貝
v1=[1,2,[34,67,9]]
import copy
淺拷貝:
拷貝第一層
v2=copy(v1)---將v1的地址copy,最外層殼拷貝一份,內層變數指向地址不變,
id(v1[2]),id(v2[2])--相同
id(v1),id(v2)---不相同,不拷貝內部變數地址
深拷貝:
v1=[1,2,[34,67,9]]
import copy
深拷貝:
拷貝所有資料(可變)
V3=deepcoyy(v1)---將v1中可變型別地址進行拷貝,適合嵌套的型別
id(v1),id(v2)--不同
id(v1[2],id(v2[2))--不同,內部變數地址也拷貝
實體驗證:
import copy
v1=[1,2,[34,67,9]]
v2=copy.copy(v1)
print(id(v1),id(v2))
print(id(v1[2]),id(v2[2]))
v3=copy.deepcopy(v1)
print(id(v1),id(v3))
print(id(v1[2]),id(v3[2]))
輸出:
39290696 39291976
39290504 39290504
39290696 39291912
39290504 39291848
總結:
- 深淺拷貝只針對可變型別,如果只有一層,深、淺拷貝拷貝相同,
- 淺拷貝:只拷貝第一層,內部元素指向不變,
- 深拷貝:拷貝嵌套層次中所有的可變型別,不可變型別指向不變,可變型別重新復制一份,可變型別內的元素指向還是指向原先的位置,(內部元素其實也拷貝,但是為數字,字串常見元素,所以位置不變)
特殊情況:
v1=(1,2,3)
import copy
v2=copy.copy(v1)
print(id(v1),id(v2))
v3=copy.deepcopy(v1)
print(id(v1),id(v3)
元組不可變,所以深淺拷貝的id都不變,
v1=(1,2,3,[3,4,5])
import copy
v2=copy.copy(v1)
print(id(v1),id(v2))
v3=copy.deepcopy(v1)
print(id(v1),id(v3)
- 深淺拷貝只針對可變型別,
- 元組內有可變型別(不可變型別內部有可變型別),深拷貝時,需要重新再創建一份,所以深拷貝后id會變化,
- 深拷貝v3變化,v2與v1相同,
- 字串,元組,數字---資料型別,不可型別,
- 檔案操作
記憶體中默認編碼方式為unicode;檔案操作包括:打開,操作,關閉,
-
打開
- r,只能讀, 【**】
- w,只能寫,寫之前清空, 【**】
- a,只能追加,【*】
- r+
- 讀:默認從0的游標開始讀,也可以通過 seek 調整游標的為位置,
- 寫:從游標所在的位置開始寫,也可以通過 seek 調整游標的位置,
- w+
- 讀:默認游標永遠在寫入的最后或0,也可以通過 seek 調整游標的位置,
- 寫:先清空,
- a+
- 讀:默認游標在最后,也可以通過 seek 調整游標的位置,然后再去讀取,
- 寫:永遠寫到最后,
-
操作
- 讀
- read()
- read(n) # 游標所在位置,后讀取n個字符,
- readlines()
- write
- 讀
-
關閉
-
檔案讀取流程:
file_object=open('log.txt',mode='r',encode='utf-8')
content=file_object.read()
print(content)
file_object.close() -
寫入流程:
file_object=open('log.txt',mode='w',encode='utf-8') ##w只寫,打開瞬間清除已經存在的資料,一般用于新建,
file_object.write('zhangsan')
file_object.close() -
操作型別:
a:追加,在檔案尾部追加,
r:只讀,檔案不存在報錯,
w:只寫,先清空,一般用于檔案不存在新建,
a:追加,檔案不存在,新建,
可讀可寫:r+
寫入:根據游標的位置,從當前游標位置開始寫入操作(可能會覆寫其他文字),
file_object.seek(2)#調整游標的位置,
file_object=open('log.txt',mode='r+',encode='utf-8')
file_object.write(你好)##有個游標,先寫入,在開始0位元組寫入你好,覆寫前兩個字,
content=file_object.read()
print(content)
file_object.write(6666)
file_object.close()
w+:
默認游標在最后,
寫入時候將檔案清空,讀取時候需要調整游標位置,
如果先讀取,再寫入,游標已經在寫入的后面,在讀取的時候,無法讀取游標前面的內容,
需要將游標移動至前面,file_object.seek(0),才可以讀取到內容,
可讀可寫:a+
默認游標在檔案最后,讀取內容需要將游標移動至最前面,file_object.seek(0)
如果調整游標位置:file_object.seek(0),寫入內容,還是寫在現在內容后
r+:
data=https://www.cnblogs.com/cuiyongchao007/p/file_objcet.read(n)###讀從當前游標位置讀取n個字符
file_object.readlines()###按照行讀取,按照串列存入,
如果讀取特別大的檔案:
按行讀取:
for line in file_object:
print(line.strip()) ##去掉換行符號
寫操作:
file_object=open('log.txt',mode='w',encode='utf-8')
file_object.write('wxwlllxx\n') ###第一次寫入的時候,在最后添加換行符,再次寫入的時候就不會清空,內容在換行符游標的后面進行第二次內容寫入,
file_object.write('ix;wxmslhs')
###這里寫入的內容就包括第一次和第二次寫入的內容,兩部分,
print(content)
file_object.close()
總結
- 深淺拷貝
- 檔案操作
- 打開
- 讀寫
- 關閉
- 檔案操作和資料型別的結合使用,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/41174.html
標籤:其他
