赋值操作
我们先来看两个内容相同的对象:
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
结果证明''=''是浅拷贝.