Python之赋值、深浅拷贝

拷贝就是一个变量的值传给另外一个变量。在python 中 id()方法可以查看存放变量的内存地址,这为我们下面理解深浅copy提供了便利。

浅拷贝是指把存放变量的地址值传给被赋值,最后两个变量引用了同一份地址:

a = [1,2,3]
b = a
print(id(a),id(b))
print(a)
print(b)
b.append(4)
print(a)

#output:
#1656807161160 1656807161160
#[1, 2, 3]
#[1, 2, 3]
#[1, 2, 3, 4]

深拷贝是指被赋值的变量开辟了另一块地址用来存放要赋值的变量的值(内容)。在python中引用copy模块,copy模块中有deepcopy()方法,调用它完成变量的深copy,观察变量地址:

import copy
a = [1,2,3]
b = a
c = copy.deepcopy(a)
c.append(4)
b.append(5)
print(id(a),id(b),id(c))
print(a)
print(c)

# output
# 2264089230664 2264089230664 2264089230792
# [1, 2, 3, 5]
# [1, 2, 3, 4]

使用copy模块的copy功能的时候,会根据当前拷贝的数据类型,可变类型和不可变类型有不同的处理方式:

import copy
a = [1,2,3]
b = [3,4,5]
c = (a,b)
d = copy.copy(c)
print(c,id(c))
print(d,id(d))
e = [a,b]
f = copy.copy(e)
print(e,id(e))
print(f,id(f))

# output
# ([1, 2, 3], [3, 4, 5]) 2505041443080
# ([1, 2, 3], [3, 4, 5]) 2505041443080
# [[1, 2, 3], [3, 4, 5]] 2505041444488
# [[1, 2, 3], [3, 4, 5]] 2505041455944

总结:

=                        :地址相同;原值改变,值随之改变

copy.copy()        :可变类型(list、dict)地址不同;原值改变,值随之改变

                              不变类型(tuple)地址相同;值不可变

copy.deepcopy():地址不同;原值改变,值不随之改变

参考文献:

[1] https://jingyan.baidu.com/article/b0b63dbf3ea8d64a483070d6.html

猜你喜欢

转载自blog.csdn.net/qq_38575545/article/details/84872152