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

查看:129
本文介绍了内存管理 - 关于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()函数所返回的并不是真实的内存地址呢?

解决方案

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... 原文

这篇关于内存管理 - 关于Python变量内存分配和id()函数的疑惑的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆