a=5
b=5
a is b
True
a=[1,2,3]
b=[1,2,3]
a is b
False
我这么给你讲吧,其实都应该不一样 ,但是python有一个内存优化机制,
叫小整数池 范围[-5,256]
在这个范围内值相同的变量内存地址都相同。
实质上小整数池内的数字已经被分配内存了。
所以这两的内存地址会相同
类似的还有intern机制你看百度查看一下 小整数池。
但是如果你用pycharm等编译器 先统一编译再运行时 还有一个大整数对象池。
同学你好,请参考python对相同值的内存管理。
python对于相同值的内存管理
python中,对于相同值的数据,地址是否一致??
大概来说:
1 对于整数、短字符串等值,在内存中只会有一份,也就是地址一致。
2 对于元组、字典、列表、集合以及range、map等容器类对象,这些的类型的数据值即使看起来一样,内存地址也是不一样的。
3 在同一个列表或者元组中,很大的整数在内存中会保存在同一地址 —— 注意,长字符串不会保存在同一地址。
4 对于实数(有理数、无理数)来说,由于精度存储问题,其地址是不同的。
所以说is函数比较内存地址的时候,对于小整数、短字符串等值,可以共用一份地址,is函数就是返回true;其他类型基本上地址是不相同的。
也正如阿左这位大佬所说,共用不是平白地共用,而是短小才共用。把机制搞清楚就行,一般赋值比如a=b都是共用了id,a is b返回true
共用id除了默认的小数字和短字符串,就是赋值产生的id共享。
主要看实际对象的类型的,列表本身是可变对象,a = b都是指向列表引用的位置判断的是值,但a is b是判断两个对象的内存地址是否一样