深淺拷貝詳解
阿新 • • 發佈:2019-01-11
-
直接賦值:其實就是物件的引用(別名)。
-
淺拷貝(copy):拷貝父物件,不會拷貝物件的內部的子物件。
-
深拷貝(deepcopy): copy 模組的 deepcopy 方法,完全拷貝了父物件及其子物件。
字典淺拷貝例項
例項
1 2 3 4 5 6 7 |
>>>a
=
{
1
: [
1
,
2
,
3
]}
>>> b
=
a.copy()
>>> a, b ({
1
: [
1
,
2
,
3
]}, {
1
: [
1
,
2
,
3
]})
>>> a[ 1
].append(
4
)
>>> a, b
({
1
: [
1
,
2
,
3
,
4
]}, {
1
: [
1
,
2
,
3
,
4
]})
|
深度拷貝需要引入 copy 模組:
例項
1 2 3 4 5 6 7 |
>>>
import
copy
>>> c
=
copy.deepcopy(a)
>>> a, c
({
1
: [
1
,
2
,
3
,
4
]}, {
1
: [
1
,
2
,
3
,
4
]})
>>> a[
1
].append(
5
)
>>> a, c
({
1
: [
1
,
2
,
3
,
4
,
5
]}, {
1
: [
1
,
2
,
3
,
4
]})
|
解析
1、b = a: 賦值引用,a 和 b 都指向同一個物件。
2、b = a.copy(): 淺拷貝, a 和 b 是一個獨立的物件,但他們的子物件還是指向統一物件(是引用)。
3、b = copy.deepcopy(a): 深度拷貝, a 和 b 完全拷貝了父物件及其子物件,兩者是完全獨立的。
更多例項
以下例項是使用 copy 模組的 copy.copy( 淺拷貝 )和(copy.deepcopy ):
例項
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#!/usr/bin/python
# -*-coding:utf-8 -*-
import
copy
a
=
[
1
,
2
,
3
,
4
, [
'a'
,
'b'
]]
#原始物件
b
=
a
#賦值,傳物件的引用
c
=
copy.copy(a)
#物件拷貝,淺拷貝
d
=
copy.deepcopy(a)
#物件拷貝,深拷貝
a.append(
5
)
#修改物件a
a[
4
].append(
'c'
)
#修改物件a中的['a', 'b']陣列物件
print
(
'a = '
, a )
print
(
'b = '
, b )
print
(
'c = '
, c )
print
(
'd = '
, d )
|
以上例項執行輸出結果為:
1 2 3 4 |
a
=
[
1
,
2
,
3
,
4
, [
'a'
,
'b'
,
'c'
],
5
]
b
=
[
1
,
2
,
3
,
4
, [
'a'
,
'b'
,
'c'
],
5
]
c
=
[
1
,
2
,
3
,
4
, [
'a'
,
'b'
,
'c'
]]
d
=
[
1
,
2
,
3
,
4
, [
'a'
,
'b'
]]
|