关于Python变量内存分配和id()函数的疑惑

发布于 2022-09-05 14:51:59 字数 822 浏览 27 评论 0

我有这样一段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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

赠我空喜 2022-09-12 14:51:59

1.需要搞清楚可变对象和不可变对象,list 可变,int不可变
2.这个是id函数的定义

def id(*args, **kwargs): # real signature unknown
    """
    Return the identity of an object.
    
    This is guaranteed to be unique among simultaneously existing objects.
    (CPython uses the object's memory address.)
    """
    pass

你会发现相邻数字之间的差值也是一样的(32), 所以他们是在内存里整齐排列的。

3.Python 一切皆对象, int 实际上是 type的类的实例(可以id(int)),实际上在内存里int的地址就是和整数对象排列在一起。

推荐看下 http://blog.csdn.net/cpp_chen... 原文

不即不离 2022-09-12 14:51:59

我查到几篇博客了有相关内容的讲解:
https://www.androiddev.net/py...
https://foofish.net/python-in...
http://www.cnblogs.com/greatf...

这种机制不知道是叫小整数对象池还是小对象整数池,反正原理大概就是这样。。。

淤浪 2022-09-12 14:51:59

小对象整数池

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文