Python内存模型

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

""" tip: 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()对象时,对象里的子元素是复制了对象还是仅仅是引用呢?

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
"""

可知,仅仅是复制了引用,此时可使用deepcopy()深拷贝,来完整复制一个对象。

猜你喜欢

转载自blog.csdn.net/weixin_37528989/article/details/114987933