编译单元的区别关于交互式解释器和python源代码文件解释单元的区别引用网友@RednaxelaFX的回答在CPython交互式解释器中,每次输入一行可以立即执行的代码,Python将其作为一个编译单元编译成字节码并解释执行;如果输入的代码还没有构成一个完整的单元,比如函数声明或者类声明,那么在得到一个完整单元的输入后,就会被当作一个编译单元。在使用python命令整体解释一个Python源代码文件时,编译单元是一个函数,Python的顶层代码也被视为一个函数。编译单元的常量池每个编译单元都有自己唯一的常量池。在同一个编译单元(PyFunctionObject)中出现的具有相同值的常量只会出现在常量池中,并且肯定会对应到运行时。同一个对象。在不同的编译单元中,指向问题由以上两种机制处理。小整数池和intern机制使得不同编译单元的常量也可能指向同一个对象。这样,在单独的.py文件中运行下面的代码会出现和上面的矛盾#Test.pya=10.1b=10.1print(aisb)#true其实这是因为a和b在最前面level代码属于同一个编译单元,所以共享同一个常量池。但是,上面的代码是在交互式解释器中执行的。两条赋值语句在不同的编译单元,不能共享。所以:>>>a=10.1;b=10.1;>>>aisbTrue赋值语句在同一行,在同一个编译单元,指向同一个对象。综上所述,关于常量对象存储机制的所有问题都解决了。在同一个编译单元中,常量池是共享的,在不同的编译单元中使用小整数池和intern机制。感觉挺复杂的,但是作为学习来分析,实际开发中凭直觉使用是没有问题的。值得一提的是,本文提到的共享对象都是指字符串、整数、小数等不可变对象,而列表(list)、字典(dist)等可变对象并不作为共享对象存在,每次创建一个新的列表,都必须在内存中创建一个新的列表对象。家
