1. 程式人生 > >python列表中的賦值與深淺拷貝

python列表中的賦值與深淺拷貝

首先建立一個列表

a=[[1,2,3],4,5,6]

一、賦值

a=[[1,2,3],4,5,6]
b=a
a[0][1]='tom'
print(a)
print(b)
結果:

[[1, 'tom', 3], 4, 5, 6]
[[1, 'tom', 3], 4, 5, 6]

a=[[1,2,3],4,5,6]
b=a
b[0][1]='tom'
print(a)
print(b)
結果:
[[1, 'tom', 3], 4, 5, 6]
[[1, 'tom', 3], 4, 5, 6]
總結:賦值不管是對a列表改變還是對b列表改變,
只要改變其中一個,另一個也會跟著變,這是因為a
和b共用一塊記憶體,沒有建立新的記憶體,
他們是相同的,他們指向同一個記憶體區域。

二、淺拷貝 [:]or copy()

a=[[1,2,3],4,5,6]
b=a.copy()
b[0][1]='tom'
print(a)
print(b)
結果: 

    [[1, 'tom', 3], 4, 5, 6]
    [[1, 'tom', 3], 4, 5, 6]

a=[[1,2,3],4,5,6]
b=a.copy()
a[0][1]='tom'
print(a)
print(b)
結果:
[[1, 'tom', 3], 4, 5, 6]
[[1, 'tom', 3], 4, 5, 6]

a=[[1,2,3],4,5,6]
b=a.copy()
b[1]='tom'
print(a)
print(b)

結果:

   [[1, 2, 3], 4, 5, 6]
   [[1, 2, 3], 'tom', 5, 6]

a=[[1,2,3],4,5,6]
b=a.copy()
a[1]='tom'
print(a)
print(b)
結果:

   [[1, 2, 3], 'tom', 5, 6]
   [[1, 2, 3], 4, 5, 6]

 

總結:從上面程式碼可以看出來淺拷貝是重新開闢一塊記憶體,拷貝第一層資料,不拷貝內部子元素

在本程式碼中,b列表重新開闢了一塊記憶體放元素【b【0】,4,5,6】,也就是第一層內容,

然後b【0】的位置指向了a【0】指向的記憶體位置

 

三、深拷貝   使用copy函式

 

重新開闢一塊記憶體,存放拷貝列表的所有內容。a集合與b集合互不影響

import copy
a=[[1,2,3],4,5,6]
b=copy.deepcopy(a)
a[1]='tom'
print(a)
print(b)
結果:

  [[1, 2, 3], 'tom', 5, 6]
   [[1, 2, 3], 4, 5, 6]

import copy
a=[[1,2,3],4,5,6]
b=copy.deepcopy(a)
b[1]='tom'
print(a)
print(b)
結果:

  [[1, 2, 3], 4, 5, 6]
  [[1, 2, 3], 'tom', 5, 6]

import copy
a=[[1,2,3],4,5,6]
b=copy.deepcopy(a)
b[0][1]='tom'
print(a)
print(b)
結果;

  [[1, 2, 3], 4, 5, 6]
  [[1, 'tom', 3], 4, 5, 6]

import copy
a=[[1,2,3],4,5,6]
b=copy.deepcopy(a)
a[0][1]='tom'
print(a)
print(b)
結果:

  [[1, 'tom', 3], 4, 5, 6]
   [[1, 2, 3], 4, 5, 6]

copy函式也可以淺拷貝:

 

import copy
a=[[1,2,3],4,5,6]
b=copy.copy(a)
a[0][1]='tom'
print(a)
print(b)
結果:

   [[1, 'tom', 3], 4, 5, 6]
   [[1, 'tom', 3], 4, 5, 6]