Python基础——深拷贝、浅拷贝

文章目录

  • 1.前言
  • 2.变量的地址(id)
  • 3.浅拷贝(copy.copy)
  • 4.深拷贝(copy.deepcopy)

1.前言

Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果。

2.变量的地址(id)

什么是id?一个对象的id值在CPython解释器里就代表它在内存中的`地址

import copy

a = [11,22,33,44]
b = a

print(id(a))
print(id(b))
print(id(a) == id(b))

b[1] = 8888
print(a,b)

#输出
4558214960
4558214960
True
[11, 8888, 33, 44] [11, 8888, 33, 44]

3.浅拷贝(copy.copy)

当使用浅拷贝时,python只是拷贝了最外围的对象本身,内部的元素都只是拷贝了一个引用而已。看代码:

import copy

a = [11,22,33,44]
c = copy.copy(a)

print(id(a))
print(id(c))
print(id(a) == id(c))

print('\n')
c[1] = 8888
print(a)
print(c)
print(id(a))
print(id(c))
print(id(a) == id(c))

#输出
4559192784
4559193024
False


[11, 22, 33, 44]
[11, 8888, 33, 44]
4559192784
4559193024
False

4.深拷贝(copy.deepcopy)

deepcopy对外围和内部元素都进行了拷贝对象本身,而不是对象的引用。

import copy

a = [[11,22],[33,44]]
d = copy.copy(a)

print(id(a))
print(id(d))
print(id(a) == id(d))

a[1][1] = 8888
print(a)
print(d)

print('\n')
e = copy.deepcopy(a)     #因为时深拷贝,这时e中内部元素的值不会因为a中的值改变而改变
a[1][0] = 9999 
print(a)
print(e)
print(id(a))
print(id(e))
print(id(a) == id(e))

#输出
4559792160
4559791920
False
[[11, 22], [33, 8888]]
[[11, 22], [33, 8888]]


[[11, 22], [9999, 8888]]
[[11, 22], [33, 8888]]
4559792160
4556920224
False

你可能感兴趣的:(Python基础)