Python 列表賦值、淺拷貝、深拷貝-02

”’
關於python中列表、字典的深淺拷貝問題之前認識比較模糊,之前的筆記中其實只是區分了拷貝和賦值的問題,
今天以列表爲例重新學習一下:
關於深淺拷貝和賦值的概念:
a.直接賦值: 用等號 = ,其實就是對象的引用
b.淺拷貝: 用copy( ),拷貝父對象,但是不會拷貝內部子對象
c.深度拷貝: 用deepcopy,是採用大模塊copy中的deepcopy方法,完全拷貝父對象和子對象
”’

#!/usr/bin/env python
# -*- coding: utf-8 -*-


import copy

def print_all_list(a=[],b=[],c=[],d=[],e=[],f=[],log=''):
  print log
  print "a:", a
  print "b:", b
  print "c:", c
  print "d:", d
  print "e:", e
  print "f:", f

if __name__ == "__main__":
  a = [0,1,2,3,[4,5,6],[7,8,9]]
  b = a                        ## 直接賦值
  c = copy.copy(a)             ## 淺拷貝
  d = copy.deepcopy(a)         ## 深拷貝
  e = list(a)                  ## 待測試
  f = a[:]                     ## 待測試
  print_all_list(a,b,c,d,e,f,"初始:a爲原列表,b爲賦值,c爲淺拷貝,d爲深拷貝,e&f待測試")

  a.append([0,0,0])
  print_all_list(a,b,c,d,e,f,"給a添加了一個列表元素[0,0,0]")
  ## 可以看到直接賦值的b也發生改變了,說明:a.直接賦值——就是對對象的引用

  a[4].append(100)
  print_all_list(a,b,c,d,e,f,"對a索引爲4的子對象[4,5,6]操作,增加一個元素100")
  ## 可以看到除直接賦值的情況外,淺拷貝的索引爲4的子對象也發生了變化。
  ## 說明淺拷貝只拷貝父對象,但是不會拷貝內部子對象。對於父對象中的子對象只是進行索引。
  ## 而深拷貝,則是完全創建了一個新的列表。

  ##最終可以看到,e=list(a)、f=a[:]兩種方式也是淺拷貝。

'''
輸出
初始:a爲原列表,b爲賦值,c爲淺拷貝,d爲深拷貝,e&f待測試
a: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9]]
b: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9]]
c: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9]]
d: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9]]
e: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9]]
f: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9]]
給a添加了一個列表元素[0,0,0]
a: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9], [0, 0, 0]]
b: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9], [0, 0, 0]]
c: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9]]
d: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9]]
e: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9]]
f: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9]]
對a索引爲4的子對象[4,5,6]操作,增加一個元素100
a: [0, 1, 2, 3, [4, 5, 6, 100], [7, 8, 9], [0, 0, 0]]
b: [0, 1, 2, 3, [4, 5, 6, 100], [7, 8, 9], [0, 0, 0]]
c: [0, 1, 2, 3, [4, 5, 6, 100], [7, 8, 9]]
d: [0, 1, 2, 3, [4, 5, 6], [7, 8, 9]]
e: [0, 1, 2, 3, [4, 5, 6, 100], [7, 8, 9]]
f: [0, 1, 2, 3, [4, 5, 6, 100], [7, 8, 9]]

'''
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章