Python编程学习5:python id()函数和内存分配理解

1.  id()函数可返回对象的内存地址

python中会为每个对象分配内存,哪怕他们的值完全相等。id(object)函数是返回对象object在其生命周期内位于内存中的地址,id函数的参数类型是一个对象。如下例子:c, d 和 2.0 地址不同,但值相等。

c = 2.0
d = 2.0
print(id(c),id(d),id(2.0))
print('c == d:',c==d)
print('c is d:',c is d)

c == d 比较的是c和d的值是否相等,c is d 则比较的是c和d内存(或id)是否一样。

2537439396824 2537439396776 2537439396800
c == d: True
c is d: False


2. 为了提高内存利用效率对于一些简单的对象,如一些数值较小的int象,字符串对象等python采取重用对象内存的办法.

    (1)如指向a=2b=2时,由于2为简单的int类型且数值小,python不会两次为其分配内存,而是只分配一次,然后将ab同时指向已分配的对象。

a = 2
b = 2
print(id(a),id(b),id(2))
print('a == b:',a==b)
print('a is b:',a is b)
1683941872 1683941872 1683941872
a == b: True
a is b: True

e = 'test'
f = 'test'
print(id(e),id(f),id('test'))
print('e == f:',e==f)
print('e is f:',e is f)
2537402630528 2537402630528 2537402630528
e == f: True
e is f: True

     (2)如对于数值较大的int对象,python会为aa和bb分别申请一块内存,来存储1999839。

aa = 1999839
bb = 1999839
print(id(aa),id(bb),id(1999839))
print('aa == bb:',aa==bb)
print('aa is bb:',aa is bb)
2537439576464 2537439576368 2537438627472
aa == bb: True
aa is bb: False


3. 内存分配理解

       x=3这句的执行过程并不是先获取x原来指向的对象的地址,再把内存中的值更改为3,而是新申请一段内存来存储对象3,再让x去指向对象3,所以两次id(x)的值不同。

x=2
print(id(2))
print(id(x))
x=3
print(id(3))
print(id(x))

1683941872
1683941872
1683941904
1683941904
L=[1,2,3]
M=L
print(id(L))
print(id(M))
print(id(L[2]))
L[0]=2
print(id(L))
print(M)

2537439413000
2537439413000
1683941904
2537439413000
[2, 2, 3]

L[0] 和 L[1] 同时指向数值2,所以地址相同 (如果是2.0则地址不同)




 


参考文献:https://blog.csdn.net/tycoon1988/article/details/38850443

  • 54
    点赞
  • 134
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
这个问题需要具体的数据结构和数据输入方式才能给出代码实现。以下是一种可能的实现方式: 假设学生的信息以字典方式存储,键为学号,值为包含学生姓名和成绩的字典,如下所示: ``` students = { '001': {'name': 'Alice', 'score': 85}, '002': {'name': 'Bob', 'score': 92}, '003': {'name': 'Charlie', 'score': 78}, '004': {'name': 'David', 'score': 90}, '005': {'name': 'Emily', 'score': 86} } ``` 可以编写一个函数,输入为学生信息的字典,输出为包含每个学生的学号和最高分的列表,如下所示: ```python def get_highest_scores(students): highest_scores = [] for id, info in students.items(): highest_score = max(info['score'] for id, info in students.items()) if info['score'] == highest_score: highest_scores.append({'id': id, 'score': highest_score}) return highest_scores ``` 该函数使用了一个列表来保存每个学生的学号和最高分,对每个学生的成绩进行一次最大值计算,如果该学生的成绩等于最大值,则将该学生的学号和最高分添加到列表中。最后返回列表。 示例运行代码如下: ```python students = { '001': {'name': 'Alice', 'score': 85}, '002': {'name': 'Bob', 'score': 92}, '003': {'name': 'Charlie', 'score': 78}, '004': {'name': 'David', 'score': 90}, '005': {'name': 'Emily', 'score': 86} } highest_scores = get_highest_scores(students) print(highest_scores) ``` 输出结果为: ``` [{'id': '002', 'score': 92}] ``` 表示学号为002的学生获得了最高分92分。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值