关于Python变量内存分配和id()函数的疑惑
我有这样一段Python代码
# 列表l1
l1 = [12, 13, 14, 15, 16]
# 数字n1
n1 = 12
# 列表l1中元素的id
id_l1 = [id(n) for n in l1]
# 打印列表l1中元素的id
print("id_l1: ", id_l1)
# 打印数字n1的id
print("id_n1", id(n1))
# 列表l2
l2 = [12, 13, 14, 15, 16]
# 列表l2中元素的id
id_l2 = [id(n) for n in l2]
# 打印列表l2中元素的id
print("id_l2:", id_l2)
print(id(l1))
print(id(l2))
我尝试通过上面代码去查看变量的内存地址。
我预想的是列表中元素的内存地址和整数变量的内存地址是不同的,且不同列表中的元素的内存地址也应该是不同的,但是我得到了这样的结果:
# 上诉代码的运行结果
id_l1: [1374364720, 1374364752, 1374364784, 1374364816, 1374364848]
id_n1 1374364720
id_l2: [1374364720, 1374364752, 1374364784, 1374364816, 1374364848]
2355866913672
2355866928648
可见,l1中数字12元素的内存地址和整数n1的内存地址一样,且列表l1和列表l2中元素的内存地址完全一样,虽然l1和l2的内存地址不一样。
请问Python的内存地址分配的规则到底是什么样的呢?亦或者是id()函数所返回的并不是真实的内存地址呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
1.需要搞清楚可变对象和不可变对象,list 可变,int不可变
2.这个是id函数的定义
你会发现相邻数字之间的差值也是一样的(32), 所以他们是在内存里整齐排列的。
3.Python 一切皆对象, int 实际上是 type的类的实例(可以id(int)),实际上在内存里int的地址就是和整数对象排列在一起。
推荐看下 http://blog.csdn.net/cpp_chen... 原文
我查到几篇博客了有相关内容的讲解:
https://www.androiddev.net/py...
https://foofish.net/python-in...
http://www.cnblogs.com/greatf...
这种机制不知道是叫小整数对象池还是小对象整数池,反正原理大概就是这样。。。
小对象整数池