Python参数传递与内存开销

Python数据传递与内存开销

本文探讨Python变量在赋值、传参、深浅拷贝时,通过观察变量id是否改变,得知是否会发生另外的内存开销

1. 赋值运算符
# 指针(复制地址)
x=1
print(id(x))
y=x
print(id(y))
2056219879728
2056219879728
# 指针(复制地址)
x=[1,2]
print(id(x))
y=x
print(id(y))
2056301222336
2056301222336
2. 函数参数传递与结果返回
  • P y t h o n Python Python传参与返回结果默认都是用指针
def hello(obj):
    return obj

x=1
print(id(x))
y=hello(x)
print(id(y))
2056219879728
2056219879728
3. 构造

构造的实质是调用构造函数, 所以传递数据用的都是指针

  1. 内外均为不可变对象
a,b='hjd','zyy'
print(id(a),id(b))
x=(a,b)
print(id(x[0]),id(x[1]))
2056301519088 2056301522160
2056301519088 2056301522160
  1. 内为可变, 外为不可变
a, b = [1], [2]
print(id(a), id(b))
x = (a, b)
print(id(x[0]), id(x[1]))

2056300472384 2056301583616
2056300472384 2056301583616
  1. 内为不可变, 外为可变
a, b = 'hjd', 'zyy'
print(id(a), id(b))
x = [a, b]
print(id(x[0]), id(x[1]))

2056301522032 2056301521200
2056301522032 2056301521200
  1. 内外均为可变
a, b = [1], [2]
print(id(a), id(b))
x = [a, b]
print(id(x[0]), id(x[1]))

2056301345408 2056301503936
2056301345408 2056301503936
4. 拷贝
浅拷贝
  1. 数据深度为1,且数据类型为不可变数据类型,例如:元组、字符串、数字等
  • id不变
import copy
x=1
y=copy.copy(x)
id(x),id(y)

(2056219879728, 2056219879728)
  1. 数据深度为1,且数据类型为可变数据类型,例如:列表、字典等
  • id改变
import copy
x=[1,2]
y=copy.copy(x)
id(x),id(y)

(2056300472384, 2056301578432)
  1. 数据深度大于1,且数据类型:外层为不可变数据类型,内层也为不可变数据类型
  • 外层id不变,内层id也不变
import copy
a, b = 'hjd', 'zyy'
x = (a, b)
print(id(x), id(x[0]), id(x[1]))
y = copy.copy(x)
print(id(y), id(y[0]), id(y[1]))
2056300284928 2056300470704 2056300472048
2056300284928 2056300470704 2056300472048
  1. 数据深度大于1,且数据类型:外层为不可变数据类型,内层为可变数据类型
  • 外层id不变,但是内层id也不变
import copy
a, b = [1],[2]
x = (a, b)
print(id(x), id(x[0]), id(x[1]))
y = copy.copy(x)
print(id(y), id(y[0]), id(y[1]))
2056300289280 2056300472384 2056301577280
2056300289280 2056300472384 2056301577280
  1. 数据深度大于1,且数据类型:外层为可变数据类型,内层为不可变数据类型
  • 外层id变,但是内层id不变
import copy
a, b = 'hjd', 'zyy'
x = [a, b]
print(id(x), id(x[0]), id(x[1]))
y = copy.copy(x)
print(id(y), id(y[0]), id(y[1]))

2056301251904 2056301517616 2056301515440
2056301576384 2056301517616 2056301515440
  1. 数据深度大于1,且数据类型:外层为可变数据类型,内层为可变数据类型
  • 外层id变,但是内层id不变
import copy
a, b = [1], [2]
x = [a, b]
print(id(x), id(x[0]), id(x[1]))
y = copy.copy(x)
print(id(y), id(y[0]), id(y[1]))
2056300470784 2056301577280 2056301579136
2056301221888 2056301577280 2056301579136
深拷贝
  1. 数据深度为1,且数据类型为不可变数据类型,例如:元组、字符串、数字等
  • id不变
import copy
x=1
y=copy.deepcopy(x)
id(x),id(y)

(2056219879728, 2056219879728)
  1. 数据深度为1,且数据类型为可变数据类型,例如:列表、字典等
  • id改变
import copy
x=[1,2]
y=copy.deepcopy(x)
id(x),id(y)

(2056301250816, 2056301538304)
  1. 数据深度大于1,且数据类型:外层为不可变数据类型,内层也为不可变数据类型
  • 外层id不变,内层id也不变
import copy
a, b = 'hjd', 'zyy'
x = (a, b)
print(id(x), id(x[0]), id(x[1]))
y = copy.deepcopy(x)
print(id(y), id(y[0]), id(y[1]))
2056300282432 2056301518384 2056301515440
2056300282432 2056301518384 2056301515440
  1. 数据深度大于1,且数据类型:外层为不可变数据类型,内层为可变数据类型
  • 外层id改变,内层id也变
import copy
a, b = [1],[2]
x = (a, b)
print(id(x), id(x[0]), id(x[1]))
y = copy.deepcopy(x)
print(id(y), id(y[0]), id(y[1]))
2056301592448 2056301576384 2056301250816
2056300283840 2056300465216 2056301345408
  1. 数据深度大于1,且数据类型:外层为可变数据类型,内层为不可变数据类型
  • 外层id变,但是内层id不变
import copy
a, b = 'hjd', 'zyy'
x = [a, b]
print(id(x), id(x[0]), id(x[1]))
y = copy.deepcopy(x)
print(id(y), id(y[0]), id(y[1]))
2056301578368 2056301249392 2056301307504
2056301250816 2056301249392 2056301307504
  1. 数据深度大于1,且数据类型:外层为可变数据类型,内层为可变数据类型
  • 外层id变,内层id也变
import copy
a, b = [1], [2]
x = [a, b]
print(id(x), id(x[0]), id(x[1]))
y = copy.deepcopy(x)
print(id(y), id(y[0]), id(y[1]))

2056301576384 2056301345408 2056301583616
2056300472128 2056301578368 2056301579968
总结如下
外层是否可变内层是否可变是深拷贝是浅拷贝外层id改变内层id改变
×××
×
×××××
××××
×××
××
×××
×
×××××
××
×××
×
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值