Python整数缓存问题
本帖最后由 春暖亦寒 于 2021-5-24 15:52 编辑a = 255
b = 255
# 进行了整数缓存
print(id(a),id(b)) # 1899768080752 1899768080752
# 没有进行整数缓存
a = 257
b = 257
print(id(a),id(b)) # 1899841094288 1899841094448
以上在命令行中执行的话,输出的结果在预期之中,但是试了一下链式赋值,结果有点看不懂了
# 系列解包赋值
a ,b= 257,257
print(id(a),id(b)) # 1899841094448 1899841094448
后来又试了一下这样:
d = (257,257,257,257,257,257,257)
l =
print() for i in range(len(d))])
print() for i in range(len(l))])
#
#
这是为什么啊?哪位大佬知道,求讲解{:1_893:} 每一个数值都有它的ID编号 ,而257的id编号2616819825328把它赋给了d或l ,这是我的理解 print() for i in range(len(l))])
猜想是迭代器的原因,所以ID没变,
而257,257也是一个地址,所以ID也没变,不知道楼主研究这个有什么用 其实这涉及到内存的深浅拷贝问题,为了节约内存相同的数据指向同一个地址
如果你给变量赋值不同的值就是不同地址
你可以尝试输出了内存地址后再修改一下和原来不同的值 你会发现地址变了 fanvalen 发表于 2021-5-24 15:59
其实这涉及到内存的深浅拷贝问题,为了节约内存相同的数据指向同一个地址
如果你给变量赋值不同的值就是不 ...
修改值的地址确实是变了:lol,但是在定义的时候,定义相同的值和不同的值分配的sizeof是完全相同的,dis出来的字节码也是相同的,感觉没啥区别,除了地址 同一次运行,对象还没被释放,所以ID值是一致的。如果是不同次数运行,就不一样。
python的小数池给0-255 固定的ID值,提高取数效率。超过这个范围的同一次运行,对象还没被释放,ID值是一样的,如果你把对象释放掉再次取值,得到的就不一样了。
建议看下python的垃圾回收机制。 gentlespider 发表于 2021-5-24 16:57
同一次运行,对象还没被释放,所以ID值是一致的。如果是不同次数运行,就不一样。
python的小数池给0-255...
看样子并没有引用到已有对象上去 春暖亦寒 发表于 2021-5-24 17:12
看样子并没有引用到已有对象上去
要搞清楚你的demo这是不同次数的运行。你用idle或者pycharm 工程界面一次运行看看。 gentlespider 发表于 2021-5-25 08:38
要搞清楚你的demo这是不同次数的运行。你用idle或者pycharm 工程界面一次运行看看。
这截图就是IDLE{:1_925:} 春暖亦寒 发表于 2021-5-25 08:51
这截图就是IDLE
我说的是工程界面,不是你这个交互式界面
页:
[1]
2