吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1491|回复: 12
收起左侧

[求助] Python整数缓存问题

[复制链接]
春暖亦寒 发表于 2021-5-24 15:22
本帖最后由 春暖亦寒 于 2021-5-24 15:52 编辑

[Python] 纯文本查看 复制代码
a = 255
b = 255
# 进行了整数缓存
print(id(a),id(b)) # 1899768080752 1899768080752
# 没有进行整数缓存
a = 257
b = 257
print(id(a),id(b)) # 1899841094288 1899841094448

以上在命令行中执行的话,输出的结果在预期之中,但是试了一下链式赋值,结果有点看不懂了
[Python] 纯文本查看 复制代码
# 系列解包赋值
a ,b= 257,257
print(id(a),id(b)) # 1899841094448 1899841094448

后来又试了一下这样:
[Python] 纯文本查看 复制代码
d = (257,257,257,257,257,257,257)
l = [257,257,257,257,257,257,257]
print([id(d[i]) for i in range(len(d))])
print([id(l[i]) for i in range(len(l))])
# [2616819825328, 2616819825328, 2616819825328, 2616819825328, 2616819825328, 2616819825328, 2616819825328]
# [2616819825328, 2616819825328, 2616819825328, 2616819825328, 2616819825328, 2616819825328, 2616819825328]

这是为什么啊?哪位大佬知道,求讲解

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Lxt160233 发表于 2021-5-24 15:32
每一个数值都有它的ID编号 ,而257的id编号2616819825328  把它赋给了d或l ,这是我的理解
ymhld 发表于 2021-5-24 15:52
print([id(l[i]) for i in range(len(l))])

猜想是迭代器的原因,所以ID没变,

而257,257也是一个地址,所以ID也没变,不知道楼主研究这个有什么用
fanvalen 发表于 2021-5-24 15:59
其实这涉及到内存的深浅拷贝问题,为了节约内存相同的数据指向同一个地址
如果你给变量赋值不同的值就是不同地址
你可以尝试输出了内存地址后再修改一下和原来不同的值 你会发现地址变了
 楼主| 春暖亦寒 发表于 2021-5-24 16:13
fanvalen 发表于 2021-5-24 15:59
其实这涉及到内存的深浅拷贝问题,为了节约内存相同的数据指向同一个地址
如果你给变量赋值不同的值就是不 ...

修改值的地址确实是变了,但是在定义的时候,定义相同的值和不同的值分配的sizeof是完全相同的,dis出来的字节码也是相同的,感觉没啥区别,除了地址
gentlespider 发表于 2021-5-24 16:57
同一次运行,对象还没被释放,所以ID值是一致的。如果是不同次数运行,就不一样。
python的小数池给0-255 固定的ID值,提高取数效率。超过这个范围的同一次运行,对象还没被释放,ID值是一样的,如果你把对象释放掉再次取值,得到的就不一样了。
建议看下python的垃圾回收机制。
 楼主| 春暖亦寒 发表于 2021-5-24 17:12
gentlespider 发表于 2021-5-24 16:57
同一次运行,对象还没被释放,所以ID值是一致的。如果是不同次数运行,就不一样。
python的小数池给0-255  ...

微信截图_20210524171052.png
看样子并没有引用到已有对象上去
gentlespider 发表于 2021-5-25 08:38
春暖亦寒 发表于 2021-5-24 17:12
看样子并没有引用到已有对象上去

要搞清楚你的demo这是不同次数的运行。你用idle或者pycharm 工程界面一次运行看看。
 楼主| 春暖亦寒 发表于 2021-5-25 08:51
gentlespider 发表于 2021-5-25 08:38
要搞清楚你的demo这是不同次数的运行。你用idle或者pycharm 工程界面一次运行看看。

这截图就是IDLE
gentlespider 发表于 2021-5-25 08:56

我说的是工程界面,不是你这个交互式界面
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-16 12:27

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表