美乐乐是哪个公司做的网站,3g版网站制作,网站认证收费吗,做百度手机网站点击前言
大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 话不多说#xff0c;直接开搞#xff0c;如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码
一、id#xff0c;is#xff0c;
在Python中#xff0c;id是什么#xff1f;
id是内存地址#xff0c;比如你利用i…前言
大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 话不多说直接开搞如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码
一、idis
在Python中id是什么
id是内存地址比如你利用id()内置函数去查询一个数据的内存地址
name 张三
print(id(name)) 那么 is 是什么 又是什么 是比较的两边的数值是否相等而 is 是比较的两边的内存地址是否相等。
如果内存地址相等那么这两边其实是指向同一个内存地址。 可以说如果内存地址相同那么值肯定相同但是如果值相同内存地址不一定相同。
二、代码块
根据官网提示我们可以获知
根据提示我们从官方文档找到了这样的说法
A Python program is constructed from code blocks. A block is a piece of Python program text that is executed as a unit. The following are blocks: a module, a function body, and a class definition. Each command typed interactively is a block. A script file (a file given as standard input to the interpreter or specified as a command line argument to the interpreter) is a code block. A script command (a command specified on the interpreter command line with the ‘-c‘ option) is a code block. The string argument passed to the built-in functions eval() and exec() is a code block.
A code block is executed in an execution frame. A frame contains some administrative information (used for debugging) and determines where and how execution continues after the code block’s execution has completed.上面的主要意思是
Python程序是由代码块构造的。
块是一个python程序的文本他是作为一个单元执行的。
代码块一个模块一个函数一个类一个文件等都是一个代码块。
而作为交互方式输入的每个命令都是一个代码块。
什么叫交互方式
就是咱们在cmd中进入Python解释器里面每一行代码都是一个代码块
例如 而对于一个文件中的两个函数也分别是两个不同的代码块 OK那么现在我们了解了代码块但这和小数据池有什么关系呢
且听下面分析。
代码块的缓存机制
Python在执行同一个代码块的初始化对象的命令时会检查是否其值是否已经存在如果存在会将其重用。
换句话说执行同一个代码块时遇到初始化对象的命令时他会将初始化的这个变量与值存储在一个字典中在遇到新的变量时会先在字典中查询记录如果有同样的记录那么它会重复使用这个字典中的之前的这个值。
所以在你给出的例子中文件执行时同一个代码块会把i1、i2两个变量指向同一个对象满足缓存机制则他们在内存中只存在一个即id相同。
代码块的缓存机制的适用范围 intfloatstrbool。 int(float) : 任何数字在同一代码块下都会复用。 bool : True和False在字典中会以10方式存在并且复用。 str 几乎所有的字符串都会符合缓存机制具体规定如下了解即可
1.非乘法得到的字符串都满足代码块的缓存机制 学习中遇到问题没人解答小编创建了一个Python学习交流QQ群702813599
寻找有志同道合的小伙伴互帮互助,群里还有不错的视频学习教程和PDF电子书s1 张三#*ewq
s2 张三#*ewq
print(s1 is s2) # True2.乘法得到的字符串分两种情况
2.1 乘数为1时任何字符串满足代码块的缓存机制
b1 太白5847395QQ0743895*^%$#((_(()) *1
a1 太白5847395QQ0743895*^%$#((_(()) *1print(a1 is b1) # True2.2 乘数2时仅含大小写字母数字下划线总长度20满足代码块的缓存机制
s1 old_ * 5
s2 old_ * 5
print(s1 is s2) # True优点 能够提高一些字符串整数处理人物在时间和空间上的性能 需要值相同的字符串整数的时候直接从‘字典’中取出复用避免频繁的创建和销毁提升效率节约内存。 三、小数据池
小数据池也称为小整数缓存机制或者称为驻留机制等等博主认为只要你在网上查到的这些名字其实说的都是一个意思叫什么因人而异。
那么到底什么是小数据池他有什么作用呢
大前提小数据池也是只针对 int(float)strbool。
小数据池是针对不同代码块之间的缓存机制
官方对于整数字符串的小数据池是这么说的:
对于整数Python官方文档中这么说
The current implementation keeps an array of integer objects for all integers between -5 and 256, when you create an int in that range you actually just get back a reference to the existing object. So it should be possible to change the value of 1. I suspect the behaviour of Python in this case is undefined.对于字符串
Incomputer science, string interning is a method of storing only onecopy of each distinct string value, which must be immutable. Interning strings makes some stringprocessing tasks more time- or space-efficient at the cost of requiring moretime when the string is created or interned. The distinct values are stored ina string intern pool. –引自维基百科经翻译可得这个表达的意思就是
Python自动将 -5~256 的整数 进行了缓存当你将这些整数赋值给变量时并不会重新创建对象而是使用已经创建好的缓存对象。
python会将一定规则的字符串在字符串驻留池中创建一份当你将这些字符串赋值给变量时并不会重新创建对象 而是使用在字符串驻留池中创建好的对象。
其实无论是缓存还是字符串驻留池都是python做的一个优化就是将~5-256的整数和一定规则的字符串放在一个‘池’容器或者字典中无论程序中那些变量指向这些范围内的整数或者字符串那么他直接在这个‘池’中引用言外之意就是内存中之创建一个。
优点 能够提高一些字符串整数处理人物在时间和空间上的性能 需要值相同的字符串整数的时候直接从‘池’里拿来用避免频繁的创建和销毁提升效率节约内存。
int 那么大家都知道对于整数来说小数据池的范围是 -5~256 如果多个变量都是指向同一个在这个范围内的数字他们在内存中指向的都是一个内存地址。 那么对于字符串的规定呢
str:字符串要从下面这几个大方向讨论了解即可
1.字符串的长度为0或者1默认都采用了驻留机制小数据池。 2.字符串的长度1,且只含有大小写字母数字下划线时才会默认驻留。 3.用乘法得到的字符串分两种情况。
3.1 乘数为1时
仅含大小写字母数字下划线默认驻留。 含其他字符长度1,默认驻留。 含其他字符长度1,默认驻留。 3.2 乘数2时
仅含大小写字母数字下划线总长度20,默认驻留。 4指定驻留。 学习中遇到问题没人解答小编创建了一个Python学习交流QQ群702813599
寻找有志同道合的小伙伴互帮互助,群里还有不错的视频学习教程和PDF电子书from sys import intern
a intern(hello!*20)
b intern(hello!*20)
print(a is b)指定驻留是你可以指定任意的字符串加入到小数据池中让其只在内存中创建一个对象多个变量都是指向这一个字符串。
满足以上字符串的规则时就符合小数据池的概念。
bool值就是TrueFalse无论你创建多少个变量指向TrueFalse那么他在内存中只存在一个。
看一下用了小数据池驻留机制的效率有多高
显而易见节省大量内存在字符串比较时非驻留比较效率o(n)驻留时比较效率o(1)。
四、总结。
如果在同一代码块下则采用同一代码块下的换缓存机制。
如果是不同代码块则采用小数据池的驻留机制。
# pycharm 通过运行文件的方式执行下列代码 这是在同一个文件下也就是同一代码块下采用同一代码块下的缓存机制。
i1 1000
i2 1000
print(i1 is i2) # 结果为True 因为代码块下的缓存机制适用于所有数字通过交互方式中执行下面代码 # 这是不同代码块下则采用小数据池的驻留机制。 学习中遇到问题没人解答小编创建了一个Python学习交流QQ群702813599
寻找有志同道合的小伙伴互帮互助,群里还有不错的视频学习教程和PDF电子书i1 1000i2 1000print(i1 is i2)
False # 不同代码块下的小数据池驻留机制 数字的范围只是-5~256.更多验证
# 虽然在同一个文件中但是函数本身就是代码块所以这是在两个不同的代码块下不满足小数据池驻存机制则指向两个不同的地址。
def func():i1 1000print(id(i1)) def func2():i1 1000print(id(i1)) func()
func2()尾语
好了今天的分享就差不多到这里了
对下一篇大家想看什么可在评论区留言哦看到我会更新哒(ง •_•)ง
喜欢就关注一下博主或点赞收藏评论一下我的文章叭 最后宣传一下呀~ 更多源码、资料、素材、解答、交流 皆点击下方名片获取呀