python函数内存地址 python内存地址不变( 二 )


字符串驻留就是每个字符串只有一个副本,多个对象共享该副本 , 驻留只针对不可变数据类型,比如字符串,布尔值 , 数字等 。在这些固定数据类型处理中 , 使用驻留可以有效节省时间和空间,当然在驻留池中创建或者插入新的内容会消耗一定的时间 。
下面举例介绍python中的驻留机制 。
在Python对象及内存管理机制一文中介绍了python的参数传递以及以及内存管理机制,来看下面一段代码:
知道结果是什么吗?下面是执行结果:
l1和l2内容相同,却指向了不同的内存地址,l2和l3之间使用等号赋值,所以指向了同一个对象 。因为列表是可变对象,每创建一个列表,都会重新分配内存,列表对象是没有“内存驻留”机制的 。下面来看不可变数据类型的驻留机制 。
在Jupyter或者控制台交互环境中执行下面代码:
执行结果:
可以发现a1和b1指向了不同的地址,a2和b2指向了相同的地址,这是为什么呢?
因为启动时,Python 将一个-5~256之间整数列表预加载(缓存)到内存中,我们在这个范围内创建一个整数对象时 , python会自动引用缓存的对象 , 不会创建新的整数对象 。
浮点型不支持:
如果上面的代码在非交互环境,也就是将代码作为python脚本运行的结果是什么呢?(运行环境为python3.7)
全为True,没有明确的限定临界值,都进行了驻留操作 。这是因为使用不同的环境时 , 代码的优化方式不同 。
在Jupyter或者控制台交互环境中:
满足标识符命名规范的字符:
结果:
乘法获取字符串(运行环境为python3.7)
结果:
在非交互环境中:
注意:字符串是在编译时进行驻留,也就是说,如果字符串的值不能在编译时进行计算,将不会驻留 。比如下面的例子:
在交互环境执行结果如下:
都指向不同的内存 。
python 3.7 非交互环境执行结果:
发现d和e指向不同的内存,因为d和e不是在编译时计算的,而是在运行时计算的 。前面的a = 'aa'*50是在编译时计算的 。
除了上面介绍的python默认的驻留外 , 可以使用sys模块中的intern()函数来指定驻留内容
结果:
使用intern()后,都指向了相同的地址 。
本文主要介绍了python的内存驻留,内存驻留是python优化的一种策略,注意不同运行环境下优化策略不一样 , 不同的python版本也不相同 。注意字符串是在编译时进行驻留 。
--THE END--
python函数内存地址的介绍就聊到这里吧 , 感谢你花时间阅读本站内容 , 更多关于python内存地址不变、python函数内存地址的信息别忘了在本站进行查找喔 。

推荐阅读