python 深拷贝 浅拷贝

1.b=a只是引用传递 

import copy
a=[11,22]
b=a
print('a:%d'%id(a))
print('b:%d'%id(b))

2. copy.copy:产生了新的引用,但是浅复制,指向的是同一个对象

import copy
a=[11,22]
b=copy.copy(a)
print('a:%d'%id(a))
print('b:%d'%id(b))
print('a[0]:%d'%id(a[0]))
print('b[0]:%d'%id(b[0]))

 

3 c=[a,b]只是传递了引用

import copy
a=[11,22]
b=[33,44]
c=[a,b]
print('a:%d'%id(a))
print('b:%d'%id(b))
print('c[0]:%d'%id(c[0]))
print('c[1]:%d'%id(c[1]))

4 .copy.deepcopy:如果列表里面的都是引用类型,则是深拷贝

import copy
a=[11,22]
b=[33,44]
c=[a,b]
d=copy.deepcopy(c)
print('a:%d'%id(a))
print('b:%d'%id(b))
print('c[0]:%d'%id(c[0]))
print('d[0]:%d'%id(d[0]))

 

如果列表中的元素是基本类型,则deepcopy也相当于浅拷贝

import copy
a=[11,22]
b=copy.deepcopy(a)
print('a[0]:%d'%id(a[0]))
print('b[0]:%d'%id(b[0]))

5.理解下面的原因

import copy
a=[11,22]
b=[33,44]
c=[a,b]
d=copy.copy(c)
e=copy.deepcopy(c)
c.append([55,66])
print(c)
print(d)
print(e)

 

6.元组本身是不可变类型,对于浅拷贝则相当于不拷贝

import copy
a=(11,22)
b=copy.copy(a)
# b=copy.deepcopy(a)

print(id(a))
print(id(b))

若是深拷贝,则要看元组内的元素是可变类型还是不可变类型,若是不可变类型则相当于不拷贝,如果是可变类型,则是深拷贝

import copy
a=[11,22]
b=[33,44]
c=(a,b)
d=copy.copy(c)
e=copy.deepcopy(c)

print(id(c))
print(id(d))
print(id(e))

如果copy.copy和copy.deepcopy对一个全部都是不可变类型的数据进行拷贝,则结果相同,都是引用指向

如果拷贝的是一个拥有不可变类型的

深拷贝如果是元素内容有一个可变的,则都是新建对象,如果都是不可变的,则不创建对象 

猜你喜欢

转载自blog.csdn.net/dxm809/article/details/107286926