欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python中的赋值、浅拷贝、深拷贝的区别和联系

程序员文章站 2022-05-19 15:29:19
...
#   1、赋值(注意空赋值改变地址指向)     2、浅拷贝       3、深拷贝


#直接赋值(除了用空去赋值) : x、y指向同一个地址空间的值,所以后面对x还是y进行修改x、y两者都会变
x = {}
y = x       # x为原件   y为附件
x['value'] = 24
y['value'] = 26
x['value'] = 25
print(id(x),id(y))

#直接赋值(用空去赋值) : 一开始x、y指向同一个地址空间的值   但是对x或者y进行了空字典赋值后   x、y两者不指向同一个地址空间了
x = {}
y = x
x['value'] = 24
y['value'] = 26
x['value'] = 25
y = {}   #对y进行赋值   y指向的地址空间变了   已经与x不一样了
y.clear()
print(x,y)


#浅拷贝:   浅拷贝之所以称为浅拷贝,是它仅仅只拷贝了一层  当在列表里面嵌套列表 或者 字典里面嵌套字典  第二层甚至第三层里面的内容不会重新分配空间  对其一进行修改 会改变另一者                            

# 比如对上述list_a,        
# 1、切片操作:list_b = list_a[:]   或者 list_b = [each for each in list_a]         其中切片操作   对于数组切片赋值后 (如a是数组 b = a[:]) b和a还是指向同一地址空间      
# 2、工厂函数:list_b = list(list_a)
# 3、copy函数:list_b = copy.copy(list_a)


#深拷贝     只有copy中的deepcopy模块
import copy
x1 = [1,1,2,3,5]
sd = copy.deepcopy(x1)
sd

#关于拷贝的警告  
# 1、对于非容器类型,如数字,字符,以及其它“原子”类型,没有拷贝一说。产生的都是原对象的引用
# 2、如果元组变量值包含原子类型对象,即使采用了深拷贝,也只能得到浅拷贝