python的深淺拷貝與linux中的軟硬鏈結

2021-09-19 08:04:29 字數 2772 閱讀 2480

總結

在學習linux中的軟硬鏈結時,總是無法理解兩者之間的區別,為什麼建立軟鏈結或者硬鏈結之後修改其中乙個的內容另外乙個會隨著改變?兩者的區別在**呢?

後來發現憑藉自己硬想根本理解不了,上網搜尋了之後也不能理解的太好,果然還是依靠畫圖的方式來理解才能基本掌握。

後來在學習了python中的深淺拷貝後,突然發現和linux中的軟硬鏈結的概念挺像的,但是後來仔細體會並上機實驗,算是稍稍理解裡面的區別。在這裡就記錄一篇部落格說說我自己的理解,在以後忘記的時候回來看一看。

話不多說,先上圖

我覺得這張已經能夠很好地反映軟硬連線之間的區別了。學過c語言或者linux系統的都應該知道指標的存在,linux中的檔案內容與名字之間的關係就如圖所示,檔名和檔案的資料 是分開儲存的,由乙個檔名指向檔案資料的開始位置(這是它們邏輯上的乙個關係,實際上檔名中儲存的是檔案資料開始位置的位址等資訊,這樣才能找到檔案資料)。

建立軟連線的命令為:

ln -s 被鏈結的原始檔(要建立鏈結的完整路徑) 鏈結檔案(鏈結名)
建立檔案的軟連線,用通俗的方式講類似於windows 下的快捷方式。檢視一下快捷方式的屬性,可以看到快捷方式中儲存的就是檔案的完整路徑,而並非檔案本身。

沒有 -s 選項建立的是乙個 硬鏈結檔案,兩個檔案占用相同大小的硬碟空間,工作中幾乎不會建立檔案的硬鏈結

原始檔要使用絕對路徑,不要使用相對路徑,這樣可以方便移動鏈結檔案後,仍然能夠正常使用。

特別說明:

軟鏈結實際上只是一段文字,裡面包含著它所指向的檔案的名字,系統看到軟鏈結後自動跳到對應的檔案位置處進行處理;相反,硬聯接為檔案開設乙個新的目錄 項,硬鏈結與檔案原有的名字是平權的,在linux看來它們是等價的。由於這個原因,硬鏈結不能連線兩個不同檔案系統上的檔案。

(1)軟連線可以 跨檔案系統 ,硬連線不可以 。實踐的方法就是用共享檔案把windows下的 aa.txt文字文件連線到linux下/root目錄 下 bb,cc . ln -s aa.txt /root/bb 連線成功 。ln aa.txt /root/bb 失敗 。

(2)硬連線不管有多少個,都指向的是同乙個i節點,會把 結點連線數增加,只要結點的連線數不是 0,檔案就一直存在,不管你刪除的是原始檔還是 連線的檔案 。只要有乙個存在 ,檔案就 存在 (其實也不分什麼原始檔連線檔案的 ,因為他們指向都是同乙個 i節點)。 當你修改原始檔或者連線檔案任何乙個的時候 ,其他的檔案都會做同步的修改。軟鏈結不直接使用節點號作為檔案指標,而是使用檔案路徑名作為指標。所以 刪除連線檔案 對原始檔無影響,但是刪除原始檔,連線檔案就會找不到要指向的檔案 。軟鏈結有自己的inode,並在磁碟上有一小片空間存放路徑名.

(3)軟連線可以對乙個不存在的檔名進行連線 。

(4)軟連線可以對目錄進行連線。

如果能夠理解了linux中的軟硬鏈結,那麼對於python中深淺拷貝的理解就能夠相對容易些,結合上面的理解將會理解的更加透徹。

這篇部落格中講的已經很全面了,我就不再列舉例子了,只是講講自己的理解。

python實現深拷貝依靠的copy模組,copy模組中有兩種深拷貝copy.copy()和copy.deepcopy(),兩者之間也有一些區別。我覺得copy.copy()屬於不完全的拷貝,而copy.deepcopy()屬於完全的拷貝。使用copy.deepcopy()之後生成的變數與原變數之間沒有任何關係,屬於那種你有的我都有,而你沒有了我還是可以有的關係。copy.deepcopy()理解起來不是很難,我就著重說說對copy.copy()的理解。

如圖三所示,使用copy.copy()後,d會重新開闢一快新的記憶體,但是記憶體中儲存的是a、b的引用,當d新增乙個元素2時,c不受d的影響,但是當a新增乙個元素4時,c和d都會受到影響,就是因為c和d中儲存的是a和b的引用。

ps: 為什麼要使用c=[a,b]呢?因為使用具體的數根本看不出效果,如果寫c=[[1,2,3],[4,5,6]],修改c[1]的值修改的是引用,並不會修改原來引用的內容。

可變型別使用copy

import copy

a =[1,

2,3]

b = copy.copy(a)

print(id

(a))

print(id

(b))4)

print

(a)print

(b)

執行結果為:

1626677717832

1626677715784[1

,2,3

,4][

1,2,

3]

不可變型別使用copy

import copy

a =(1,

2,3)

b = copy.copy(a)

print(id

(a))

print(id

(b))

執行結果為:

2043444280704

2043444280704

Python中的拷貝與深淺拷貝

即為賦值.舉個例子 a 147147 b a 賦值 print a is b true 對於淺拷貝,字典 列表 元組等型別,它們只拷貝第一層位址 import copy n1 n3 copy.copy n1 淺拷貝 print id n1 print id n3 print id n1 k3 pri...

python賦值與深淺拷貝

參考文章 在python中,物件的賦值就是簡單的物件引用,這點和c 不同。如下 a 1 2,3 hello python c b a for i in range len a print id a i id b i all true print a b true這種情況下,b和a是一樣的,他們指向同...

Python賦值與深淺拷貝

a 1,2,3 b a a 4,5,6 賦新的值給 a a 4,5,6 b 1,2,3 a 的值改變後,b 並沒有隨著 a 變 a 1,2,3 b a a 0 a 1 a 2 4,5,6 改變原來 list 中的元素 a 4,5,6 b 4,5,6 a 的值改變後,b 隨著 a 變了 上面兩段 中,...