python中物件的賦值 淺拷貝和深拷貝

2021-08-17 03:54:20 字數 3967 閱讀 7381

在python中,變數賦值實際上是簡單的物件引用。在建立乙個物件後,再把它賦給另乙個變數的時候,python並沒有拷貝這個物件,而只是簡單地拷貝了這個物件的引用。

(1)原子型別的賦值

>>> x = 3.14

>>> y = x

>>> x,y

(3.14, 3.14)

>>> id(x),id(y)

(84759984l, 84759984l)

>>> x = 1.414

>>> x,y

(1.414, 3.14)

>>> id(x),id(y)

(84759912l, 84759984l)

(2)非原子型別的賦值
>>> a = [10,[20,30]]

>>> b = a

# 改變前:

>>> a,b

([10, [20, 30]], [10, [20, 30]])

>>> id(a),id(b)

(91063304l, 91063304l)

>>> [id(x) for x in a],[id(x) for x in b]

([84836720l, 90951880l], [84836720l, 90951880l])

>>> a[0] = 100

>>> a[1][1] = 300

# 改變後:

>>> a,b

([100, [20, 300]], [100, [20, 300]])

>>> id(a),id(b)

(91063304l, 91063304l)

>>> [id(x) for x in a],[id(x) for x in b]

([90004016l, 90951880l], [90004016l, 90951880l])

在python中,對乙個物件進行淺拷貝,產生的物件是新的,其型別和原物件一樣;但其內容不是新的,只是原物件的內容的引用。

(1)舉個例子來理解

>>> 

import copy

>>> a = [10,[20,30]]

>>> b = copy.copy(a)

# 改變前:

>>> a,b

([10, [20, 30]], [10, [20, 30]])

>>> id(a),id(b)

(99615944l, 99670792l)

>>> [id(x) for x in a],[id(x) for x in b]

([91055472l, 99617160l], [91055472l, 99617160l])

>>> a[0] = 100

>>> a[1][1] = 300

# 改變後:

>>> a,b

([100, [20, 300]], [10, [20, 300]])

>>> id(a),id(b)

(99615944l, 99670792l)

>>> [id(x) for x in a],[id(x) for x in b]

([91057296l, 99617160l], [91055472l, 99617160l])

(2)淺拷貝的方式

上面例子中使用了copy模組中的copy函式來實現淺拷貝,其實python中以下這這幾種方式來實現淺拷貝:

對於淺拷貝中的例子,如果希望修改a[1]的內容時b[1]的內容不跟著一起改變,就需要用到深拷貝:copy.deepcopy()

>>> 

import copy

>>> a = [10,[20,30]]

>>> b = copy.deepcopy(a)

# 改變前:

>>> a,b

([10, [20, 30]], [10, [20, 30]])

>>> id(a),id(b)

(88462536l, 88478856l)

>>> [id(x) for x in a],[id(x) for x in b]

([80176496l, 88463752l], [80176496l, 88514952l])

>>> a[0] = 100

>>> a[1][1] = 300

# 改變後:

>>> a,b

([100, [20, 300]], [10, [20, 30]])

>>> id(a),id(b)

(88462536l, 88478856l)

>>> [id(x) for x in a],[id(x) for x in b]

([80178320l, 88463752l], [80176496l, 88514952l])

不多說了,也直接上圖理解吧:

python中的賦值 淺拷貝 深拷貝

在python中,物件賦值實際上是物件的引用。當建立乙個物件,然後把它賦給另乙個變數的時候,python並沒有拷貝這個物件,而只是拷貝了這個物件的引用 import copy a 1,2,x y b ac copy.copy a d copy.deepcopy a print id b id a i...

Python中賦值 淺拷貝與深拷貝

原文 python中關於物件複製有三種型別的使用方式,賦值 淺拷貝與深拷貝。他們既有區別又有聯絡,剛好最近碰到這一類的問題,研究下。一 賦值 在python中,物件的賦值就是簡單的物件引用,這點和c 不同。如下 list a 1,2,3,hello python c list b list a 這種...

Python中賦值 淺拷貝與深拷貝

python中關於物件複製有三種型別的使用方式,賦值 淺拷貝與深拷貝。他們既有區別又有聯絡,剛好最近碰到這一類的問題,研究下。一 賦值 在python中,物件的賦值就是簡單的物件引用,這點和c 不同。如下 list a 1,2,3,hello python c list b list a 這種情況下...