python内存管理初窥

先看一段代码:

l1 = []
for i in range(5):
	l1.append(i)
print '--- l1: ', l1

l2 = []
a = 0
for i in range(5):
	a = i
	l2.append(a)
print '--- l2: ', l2

l3 = []
a = '0'
for i in range(5):
	a = str(i)
	l3.append(a)
print '--- l3: ', l3

l4 = []
for i in range(5):
	a = {'num': i}
	l4.append(a)
print '--- l4: ', l4

l5 = []
a = {'num': 0}
for i in range(5):
	a['num'] = i
	l5.append(a)
print '--- l5: ', l5

l6 = []
a = [0]
for i in range(5):
	a[0] = i
	l6.append(a)
print '--- l6: ', l6

以下是运行结果:

--- l1:  [0, 1, 2, 3, 4]
--- l2:  [0, 1, 2, 3, 4]
--- l3:  ['0', '1', '2', '3', '4']
--- l4:  [{'num': 0}, {'num': 1}, {'num': 2}, {'num': 3}, {'num': 4}]
--- l5:  [{'num': 4}, {'num': 4}, {'num': 4}, {'num': 4}, {'num': 4}]
--- l6:  [[4], [4], [4], [4], [4]]

通过上面的结果,简单的理解就是,对于不可变数据类型(数字、字符串和元组),改变它的值就是重新开辟一块内存空间;对于可变数据类型(列表、字典),改变它就是改变它对应的内存空间里的值。

通过id()函数我们可以知道一个对象的内存地址,在上面的代码中加入id()函数看一下内存地址的变化:

l2 = []
a = 0
for i in range(5):
	a = i
	print id(a)
	l2.append(a)
print '--- l2: ', l2

l3 = []
a = '0'
for i in range(5):
	a = str(i)
	print id(a)
	l3.append(a)
print '--- l3: ', l3

l4 = []
for i in range(5):
	a = {'num': i}
	print id(a)
	l4.append(a)
print '--- l4: ', l4

l5 = []
a = {'num': 0}
for i in range(5):
	a['num'] = i
	print id(a)
	l5.append(a)
print '--- l5: ', l5

l6 = []
a = [0]
for i in range(5):
	a[0] = i
	print id(a)
	l6.append(a)
print '--- l6: ', l6

运行结果:

30900880
30900856
30900832
30900808
30900784
--- l2:  [0, 1, 2, 3, 4]
35729120
31184176
35725440
31184136
31183536
--- l3:  ['0', '1', '2', '3', '4']
36806728
36807000
36808904
36807272
36808088
--- l4:  [{'num': 0}, {'num': 1}, {'num': 2}, {'num': 3}, {'num': 4}]
36808632
36808632
36808632
36808632
36808632
--- l5:  [{'num': 4}, {'num': 4}, {'num': 4}, {'num': 4}, {'num': 4}]
36755272
36755272
36755272
36755272
36755272
--- l6:  [[4], [4], [4], [4], [4]]

通过打印的结果可以知道,列表和字典的内存地址一直没有变,也许会问为什么l4里面的5个字典对象不一样,那是因为每次for循环都重新创建了一个字典对象,l5没变是因为前面已经创建过一个字典对象a,python为了节省内存空间,后面的for循环并没有重新建立新的字典对象。

相关参考资料:

https://blog.csdn.net/wjc_fantasy/article/details/77936148

https://blog.csdn.net/dan15188387481/article/details/49864613

https://www.cnblogs.com/lfpython/p/7207747.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值