日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Shallow Copy Deep Copy in Python list

發布時間:2023/12/10 python 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Shallow Copy Deep Copy in Python list 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  今天在寫一個小程序的時候用到了2維數組, 順手就寫成了[[0.0]*length]*length, 結果為了這個小錯,調試了半個多小時,

其實之前對與淺復制和深復制已經做過學習和總結, 但真正編程用到這些知識時還是掉入了陷阱中. 所以在此做進一步的總結:

  本文通過幾個實例來說明Python中list的深復制和淺復制:

>>> a = [[]] * 10 >>> a [[], [], [], [], [], [], [], [], [], []] >>> a[0][0] = 10 #NO WAY Traceback (most recent call last):File "<stdin>", line 1, in <module> IndexError: list assignment index out of range >>> a[0].append(1) >>> a [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]]

  a[0].append(1)后, 如果a的輸出結果讓你感到有些困惑,你可以參考這里(原因是Python中的*運算采用的是淺復制).

  同樣的道理,下面的代碼我們應該都能夠理解:

>>> a[3].append(9) >>> a [[1, 9], [1, 9], [1, 9], [1, 9], [1, 9], [1, 9], [1, 9], [1, 9], [1, 9], [1, 9]] >>> a[2][1] = 3 >>> a [[1, 3], [1, 3], [1, 3], [1, 3], [1, 3], [1, 3], [1, 3], [1, 3], [1, 3], [1, 3]]

  讓我們一起來分析一下:

  對于a(理解為一個2維數組)中的每一個元素都是一個list(理解為一個1維數組), 但我們需要注意的是a的每一個元素

a[0],a[1],a[2]...指向的是同一段內存區域(淺復制),所以更改(修改值或添加值)任何一個元素(a[0]或a[1]...a[9])都會直接影

響到其它的元素.

  如何驗證a中的每一個元素a[0], a[1],...,a[9]指向同一段內存區域? 可以通過id方法來驗證:

>>> id.__doc__ "id(object) -> integer

Return the identity of an object. This is guaranteed to be unique among
simultaneously existing objects. (Hint: it's the object's memory address.)
"

?

>>> a = [[]]*10 >>> a [[], [], [], [], [], [], [], [], [], []] >>> id(a[0]) 3071938316L >>> id(a[1]) 3071938316L >>> a[0].append(1) >>> a [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]] >>> id(a[0]) 3071938316L >>> id(a[1]) 3071938316L >>>

注意:雖然a的每一個元素a[0],a[1],a[2]...指向的是同一段內存區域,但a中的各個元素是獨立的元素(他們相同但不同一),

也就是說刪除掉任何一個數據對其他的數據沒有任何影響:

>>> a = [[]] * 10 >>> a [[], [], [], [], [], [], [], [], [], []] >>> a[0].append(1) >>> a [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]] >>> len(a) 10 >>> del(a[2]) >>> a [[1], [1], [1], [1], [1], [1], [1], [1], [1]] >>> len(a) 9

  那么應該怎么實現深復制呢?其實在前面提到的文章中已經介紹了這一方法:  

>>> c = [[] for i in range(10)] >>> c [[], [], [], [], [], [], [], [], [], []] >>> c[0].append(3) >>> c [[3], [], [], [], [], [], [], [], [], []] >>>

  至此, 我覺得還有一點需要說明:

  一定要理解*操作的對象是誰, 例如: [2]*10得到[2, 2, 2, 2, 2, 2, 2, 2, 2, 2], *10操作的對象是[]中的2, 也就是說*10操

作使list中的元素2復制10次. 同理[[]]*10得到[[], [], [], [], [], [], [], [], [], []],*10操作的對象是[]中的[], 也就是說*10

操作使list中的元素[]淺復制10次, 這10個空list指向內存中相同的區域(參見上面用id驗證部分).

  下面用2段代碼作為對比列出來, 便于查看:

>>> a = [2] * 10 >>> a [2, 2, 2, 2, 2, 2, 2, 2, 2, 2] >>> id(a[0]) 164067492 >>> id(a[1]) 164067492 >>> a[0] = 1  #NOTE >>> id(a[0])  #NOTE 164067504 >>> id(a[1]) 164067492 >>>

?

>>> b = [[]] * 10 >>> b [[], [], [], [], [], [], [], [], [], []] >>> id(b[0]) 3072965964L >>> id(b[1]) 3072965964L >>> b[0].append(10) >>> id(b[0]) 3072965964L >>> id(b[1]) 3072965964L >>> b [[10], [10], [10], [10], [10], [10], [10], [10], [10], [10]] >>> b[0][0] = 1 >>> b [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]] >>> id(b[0]) 3072965964L >>> id(b[1]) 3072965964L >>> b[0] = [10] >>> b [[10], [1], [1], [1], [1], [1], [1], [1], [1], [1]] >>> id(b[1]) 3072965964L >>> id(b[0]) 3072965996L >>>

?

轉載于:https://www.cnblogs.com/lxw0109/p/shallow-copy-and-deep-copy.html

總結

以上是生活随笔為你收集整理的Shallow Copy Deep Copy in Python list的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。