python踩坑系列:=赋值、拷贝、深拷贝
python踩坑系列:赋值、拷贝、深拷贝
python踩坑系列:sorted
对于比较复杂的数据进行赋值时,需要小心一些坑,下面看一些具体例子
(测试环境: python3)
import os, sys, copy
print('赋值')
a = [[(1,2), (300,200)], 'dog']
print('a=', a)
b = a
print('b=', b)
a[1] = 'cat'
print('a=', a)
print('b=', b)
print('#'*20)
print('拷贝')
a = [[(1,2), (300,200)], 'dog']
print('a=', a)
b = copy.copy(a)
print('b=', b)
a[1] = 'cat'
print('a=', a)
print('b=', b)
print('#'*20)
print('深拷贝')
a = [[(1,2), (300,200)], 'dog']
print('a=', a)
b = copy.deepcopy(a)
print('b=', b)
a[1] = 'cat'
print('a=', a)
print('b=', b)
print('#'*20)
print('拷贝')
a = [[(1,2), (300,200)], 'dog']
print('a=', a)
b = copy.copy(a)
print('b=', b)
a[0][0] = (11,12)
print('a=', a)
print('b=', b)
print('#'*20)
print('深拷贝')
a = [[(1,2), (300,200)], 'dog']
print('a=', a)
b = copy.deepcopy(a)
print('b=', b)
a[0][0] = (11,12)
print('a=', a)
print('b=', b)
输出结果如下:
赋值
a= [[(1, 2), (300, 200)], 'dog']
b= [[(1, 2), (300, 200)], 'dog']
a= [[(1, 2), (300, 200)], 'cat'] # =赋值时,修改a的值,b也一起被修改,b相当于是a的引用
b= [[(1, 2), (300, 200)], 'cat']
####################
拷贝
a= [[(1, 2), (300, 200)], 'dog']
b= [[(1, 2), (300, 200)], 'dog']
a= [[(1, 2), (300, 200)], 'cat'] #使用copy时,修改a的值,b没被修改
b= [[(1, 2), (300, 200)], 'dog']
####################
深拷贝
a= [[(1, 2), (300, 200)], 'dog']
b= [[(1, 2), (300, 200)], 'dog']
a= [[(1, 2), (300, 200)], 'cat'] #使用deepcopy时,修改a的值,b没被修改
b= [[(1, 2), (300, 200)], 'dog']
####################
拷贝
a= [[(1, 2), (300, 200)], 'dog']
b= [[(1, 2), (300, 200)], 'dog']
a= [[(11, 12), (300, 200)], 'dog'] #使用copy时,修改a的值,b也被一起修改,说明第2层未被copy
b= [[(11, 12), (300, 200)], 'dog']
####################
深拷贝
a= [[(1, 2), (300, 200)], 'dog']
b= [[(1, 2), (300, 200)], 'dog']
a= [[(11, 12), (300, 200)], 'dog'] #使用deepcopy时,修改a的值,b没被修改,说明所以层都copy了
b= [[(1, 2), (300, 200)], 'dog']
结论:对于复杂的多层数据,根据需要使用对应的赋值方法。