一、在python中,赋值操作实际上是对象的引用
a = '优快云'
b = a
实际上b和a共享了对'优快云'的引用,即
a is b
会得到True
二、浅拷贝
对于list
a = [1, 2]
b = a[:]
b实际上是对a的浅拷贝,浅拷贝相对于深拷贝而言,浅拷贝只能在第一层级复制对象
a.append(3)
print(a)
print(b)
[1, 2, 3]
[1, 2]
这里修改a对b并没有影响,因为a和b是不同对象的引用,id不同
三、深拷贝
对于上面的例子,如果修改a,增加a的深度
a = [1, 2, [3, 4]]
b = a[:]
a[2].append(5)
print(a)
print(b)
结果是
[1, 2, [3, 4, 5]]
[1, 2, [3, 4, 5]]
b也同时被改变了 ,b不是对a的拷贝吗,查看id
2477236583432
2477236544392
id也是不同的 ,但是浅拷贝只能拷贝第一层级的对象,a[2]是一个列表,对a而言已经是第二层级了
总结起来就是,b指向的对象跟a不一样,但是b[2]跟a[2]共享引用
为了避免这种情况发生,需要用到copy模块的deepcopy函数
import copy
c = copy.deepcopy(a)
a[2].pop()
print(c)
[1, 2, [3, 4, 5]]
c还是a没有pop之前的样子,此时b
[1, 2, [3, 4]]
同时被修改
可视化网站:http://www.pythontutor.com/visualize.html#mode=edit