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.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()深拷贝,来完整复制一个对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值