Python深浅拷贝
一. 变量的内存模型
x= 1
print(id(x)) # 94454455464992
print(id(1)) # 94454455464992
print(id(5)) # 94454455465120
x= 5
print(id(x)) # 94454455465120
print(id(1)) # 94454455464992
print(id(5)) # 94454455465120
"""
Python更改变量值,发生变化的是变量地址而不是地址上的值,python还为字面量分配空间,这在C++中都不成立。
"""
(一). Python的间接引用机制
python中类型(按在修改该类型变量时是否产生新的对象分):
- 可变类型:列表,字典
- 不可变类型:int,float,str,tuple
函数调用时,实参将其引用复制给形参,此时两者指向同一个对象,根据类型特性,修改形参值时,可变变量直接在原对象上修改,不可变变量则新创建一个对象。这种机制存在于整个Python环境
tup= ([1,2], 3)
tu= tup
tu[0][0]= 3
print(tu, tup)
"""
print:
([1,3], 3)
([1,3], 3)
由以上结果可知:tup里的list存储的只是一个引用
"""
若想在函数中修改不可变实参,可用return命令
若想在函数中不修改可变实参,可引入copy模块,该模块的copy.copy()只对可变类型创建新对象,对不可变类型不创建新对象
(二).copy模块
copy.copy()函数,前面提到该函数只对可变类型创建新对象,不对不可变类型创建新对象。
当copy.copy()一个对象时,对象里的子元素是复制了对象还是仅仅是引用呢?
import copy
lst= [[1,2], 3]
lst_cp= copy.copy(lst)
print(id(lst), id(lst_cp), '\n')
print(id(lst[0]), id(lst_cp[0]))
"""
print:
139830680186504 139830680268488
139830680191752 139830680191752
"""
可知,仅仅是复制了引用,此时可使用copy.deepcopy()深拷贝,来完整复制一个对象。
标签:Python,模型,对象,lst,内存,print,copy,id From: https://www.cnblogs.com/sgqmax/p/18519931