海曙网站制作,有什么网站可以接设计单做,90设计网站免费素材,wordpress 站长工具is用于判断两个对象是否为同一个对象#xff0c;具体来说是两个对象在内存中的位置是否相同。python为了提高效率#xff0c;节省内存#xff0c;在实现上大量使用了缓冲池技术和字符串intern技术。整数和字符串是不可变对象#xff0c;也就意味着可以用来共享#xff0c;…is用于判断两个对象是否为同一个对象具体来说是两个对象在内存中的位置是否相同。python为了提高效率节省内存在实现上大量使用了缓冲池技术和字符串intern技术。整数和字符串是不可变对象也就意味着可以用来共享如100个“python”字串变量可以共享一个“python”字符串对象而不是创建100个“python”字符串。一、小整数对象池为了应对小整数的频繁使用python使用对小整数进行了缓存默认范围为[-5,256]在这个范围内的所有整数被python完全地缓存当有变量使用这些小整数时增加对应小整数对象的引用即可。由上面的实例可以看到当变量在[-5,256]之间时两个值相同的变量事实上会引用到同一个小整数对象上也就是小整数对象池中的对象而不会去创建两个对象。而当变量超出了这个范围两个值相同的变量也会各自创建整数对象所以两者对应的对象不同。二、字符串intern如果当前变量引用的字符串对象已经存在的话直接增加对应字符串对象的引用而不去创建新的字符串对象这就是字符串intern机制。说白了intern机制就是每创建一个比较短的字符串对象就在一个叫interned的字典里面查看是否存在字符串相同的字符串对象如果存在的话就把字典存放的对象的ob_refcnt加1然后销毁新创建的对象所以才会出现下面的情景 a is b的结果为True1. 奇怪的现象在详细探讨字符串intern机制之前先看一个奇怪的问题直接在交互式IPython中运行i is j的结果是False。定义一个函数并运行输出结果True上述代码分开运行结果为False但是合在一起结果却为True。也就是说分开运行的时候i和j指向不同对象而合在一起的时候ij却指向了相同对象。为了明白其中的缘由需要简单理解python的编译机制。三、编译机制在python中万物皆对象包括代码本身也是一种对象。python用code对象表示代码代码编译后产生code对象。通常一个作用域对应一个code对象。1. 编译结果上述代码中编译生成了两个code对象一个代表全局作用域另一个代表函数f。code对象保存了变量常量(常量字面量)以及编译结果。code对象用常量表来保存常量考虑到一个常量可能出现多次在一张表上保存一个常量多次太过于奢侈。所以code对象对每个常量只保存一次在需要引用它的地方使用它在常量表的位置作为常量的表示。在上述编译结果中可以看到1 2这个字符串常量使用了两次编译的代码为LOAD_CONST 0这里的0就是1 2在常量表当中的位置。由于编译的这个特性在同一个code对象 中的变量如果它们引用了同一个常量那么无论这个常量有没有缓冲机制它们引用的都是同一个对象。2. 案例理解输出结果True True True True字符串对象除了intern机制以外还有类似于小整数对象的字符缓冲池其实就是用一个类似于数组的东西(characters array)指向这个对象对只有一个字符的字符串第一次创建时候会进行如下操作1.创建对象2.对其进行intern操作3.将对象放进字符缓冲池那么下次再创建这个字符对象时候会首先查看字符缓冲池中是否存在这个对象如果存在的话返回这个缓冲对象。区别于小整数对象的是小整数对象在python解释器初始化之初就创建了而字符串缓冲池指向的对象直到用到的时候才会创建。四、编译机制与小整数对象池对比i和j引用同一个常量这是编译机制所以i与j指向同一个整数对象后面a和b虽然相等但不引用常量此时启用小整数对象池a和b都等于256在对象池中所以ab引用同一个对象后面c和d不在对象池中所以两者对象不同。这里有一点需要注意没有变量参与的运算会被编译器直接优化成对应的常量进而保存进常量表中。五、字符串intern机制与字符缓冲池在编译过程中字符串intern机制将所有的变量名进行intern但对常量进行的intern有一点特殊的限制。能够intern的常量必须只包含[a-zA-Z0-9_]即字母数字加下划线如果含有其他字符就不会intern。在运行过程中通过计算得到的字符串不会intern。字符串有一个和小整数对象池相似的字符缓冲池用于在运行过程中缓存单个字符所以计算得到的字符串虽然不会intern但如果是单个字符就会使用到字符缓冲池。可以看到a和b确实指向同一个对象而c和d指向不同对象这就是字符缓冲池。六、编译机制与字符串intern对比i包含空格包含空格的常量不会被intern而其他两个常量不包含其他字符所以会被intern。七、总结python代码被编译成code对象通常一个code对象对应于一个作用域作用域中重复出现的变量名以及常量在code中只保存一次。字符串intern机制主要作用于编译过程在编译收集完变量和常量时对变量和常量进行intern而后构建一个code对象。字符串intern对常量的intern有限制能够intern的常量必须只包含[a-zA-Z0-9_]即字母数字加下划线如果含有其他字符就不会intern。小整数对象池和字符缓冲池都是作用于运行过程中python缓存小的整数和字符当有变量使用这些对象时不用额外创建对象。