回覆列表
  • 1 # 使用者8908515326213

    python中,物件的賦值,複製(深/淺複製)之間是有差異的,如果使用的時候不注意,就可能產生意外的結果,其實這個是由於共享記憶體導致的結果

    複製:原則上就是把資料分離出來,賦值其資料,並以後修改互不影響。

    舉例說明:

    =賦值:資料完全共享(=賦值是在記憶體中指向同一個物件,如果是可變(mutable)型別,比如列表,修改其中一個,另一個必定改變,如果是不可變型別(immutable),比如字串,修改了其一個,另一個並不會變)

    list2 = list1 ,list1 完全賦值給list2 ,list2的記憶體地址與list1相同,即記憶體完全指向

    淺複製:資料半共享(複製其資料獨立記憶體存放,但是隻複製成功第一層)

    如上述程式碼,list2淺複製了list1 ,之後list2把其列表中的列表的元素給修改,從結果看出,list1也被修改了。但是僅僅修改list1列表中的第一層元素,卻並沒有影響list2。

    比較一下list2與list1的記憶體地址:False,說明,list2在記憶體中已經獨立出一部分複製了list1的資料,但是隻是淺複製,第二層的資料並沒有複製成功,而是指向了list1中的第二層資料的記憶體地址,所以共享記憶體‘相當於‘’等號賦值’‘,所以就會有list2中第二層資料發生變化,list1中第二層資料也發生變化

    如圖,這就是淺複製的原理,list2複製list1的時候只複製了他的第一層,也就是在其他記憶體中重新建立了list1的第一層資料,但是list2無法複製list1的第二層資料,也就是列表中的列表,所以他就只能指向list1中的第二層資料。由此,當修改list1中第二層資料的時候,淺複製list1的list2中的第二層資料也隨之發生改變

    深複製:資料完全不共享(複製其資料完完全全放獨立的一個記憶體,完全複製,資料不共享)

    深複製就是完完全全複製了一份,且資料不會互相影響,因為記憶體不共享。深複製的方法有匯入模組

    由此可見深複製就是資料完完全全獨立複製出來一份。不會由原先資料變動而變動。

  • 中秋節和大豐收的關聯?
  • 2年的車,自動變速箱油要換嗎?有什麼依據嗎?