Python学习之copy and deepcopy

赋值操作

我们先来看两个内容相同的对象:

lst3 = list(range(4))
lst4 = list(range(4))
print('两个对象的哈希')
print(hash(id(lst3)))
print(hash(id(lst4)))
print('他们是否=')
print(lst3==lst4)
print('他们是否is')
print(lst3 is lst4)

结果是:

两个对象的哈希
4377943688
4377942472
他们是否=
True
他们是否is
False

然后我们使用赋值操作:

lst1 = lst3
print('1 是否is 3')
print(lst1 is lst3)
print('两个对象的哈希')
print(hash(id(lst1)))
print(hash(id(lst3)))
print('修改1后')
lst1[2] = 99
print('1和3的内容:')
print(lst1)
print(lst3)
print('1 是否is 3')
print(lst1 is lst3)

结果:

1 是否is 3
True
两个对象的哈希
4377943688
4377943688
修改1后
1和3的内容:
[0, 1, 99, 3]
[0, 1, 99, 3]
1 是否is 3
True

结果表明只有哈希值相同的对象才是is

浅拷贝

我们把上面打印操作封装成一个函数isequel,比较一下浅拷贝对象前后:

lst3 = [1,[10,20],3]
print('浅拷贝')
lst4 = lst3.copy()
isequel(lst3,lst4)
print('修改3的元素后')
lst3[1][1] = 200
print('lst3=')
print(lst4)
print('lst4=')
print(lst4)
isequel(lst3,lst4)

结果:

浅拷贝
两个对象的哈希
4382428360
4382428104
他们是否=
True
他们是否is
False
修改3的元素后
lst3=
[1, [10, 200], 3]
lst4=
[1, [10, 200], 3]
两个对象的哈希
4382428360
4382428104
他们是否=
True
他们是否is
False

浅拷贝后两个对象不是is的,当修改子元素中的元素后,跟随改变,说明只是复制了地址而已

深拷贝

需要引入copy库

print('深拷贝 import copy')
lst4 = copy.deepcopy(lst3)
isequel(lst3,lst4)
print('修改3的元素后')
lst3[1][1] = 300
print('lst3=')
print(lst3)
print('lst4=')
print(lst4)
isequel(lst3,lst4)

结果

深拷贝 import copy
两个对象的哈希
4515200136
4510722440
他们是否=
True
他们是否is
False
修改3的元素后
lst3=
[1, [10, 300], 3]
lst4=
[1, [10, 200], 3]
两个对象的哈希
4515200136
4510722440
他们是否=
False
他们是否is
False

深拷贝其实是拷贝了对象的整个结构并另外创建一个新的,所以你改变对我没有影响.

=是深拷贝还是浅拷贝

print('=操作:')
lst5 = lst4
isequel(lst4,lst5)
lst4[1][1] = 400
print('lst4=')
print(lst4)
print('lst5=')
print(lst5)
isequel(lst5,lst4)

结果

=操作:
两个对象的哈希
4390140616
4390140616
他们是否=
True
他们是否is
True
lst4=
[1, [10, 400], 3]
lst5=
[1, [10, 400], 3]
两个对象的哈希
4390140616
4390140616
他们是否=
True
他们是否is
True

结果证明''=''是浅拷贝.

你可能感兴趣的:(Python学习之copy and deepcopy)