代码块和缓存机制
这是麦友@梁显浚HinChunLeung的提问:
能否介绍下python代码块的定义?
我不确定是否完全理解了他的问题,我尽量说一下吧。
狭义的代码块
Python的程序是由代码块组成的。从狭义上讲,Python通过缩进来定义代码块:
if name == '麦叔':
print('麦叔祝大家新年快乐')
print('麦叔祝大家身体健康')
print('麦叔祝大家万事如意')
else:
print('祝大家新年快乐')
print('祝大家身体健康')
print('祝大家万事如意')
整个if..else..
语句是一个代码块。
同时这个大的代码块里的if
分支是一个代码块,else
分支也是一个代码块。
所以代码块可以嵌套。
广义代码块
从广义上讲,Python程序是由代码块组成的。一个代码块(block)是一个Python程序执行的单元。下面这些都是代码块:
-
模块 module -
函数的body -
类的定义 -
一个Python文件 -
交互式Python中每一行代码都是一个代码块
缓存机制
回顾一下**#41**中讲的常量池:
有些字符串,整数等常量会被放在常量池中。同样的变量,比如字符串”maishu”,如果多次定义,都会重用同一个对象,也就是同一块内存单元。这样可以节省空间和时间。
但是中文字符串”麦叔”不会放在缓冲池中,因为全局缓冲池容量有限, 只会缓存比较小的数字,部分ASCII码组成的字符串,中文字符串“麦叔”不在缓存范围之内。
但是,在同一个Python的代码块中,也存在这样的缓存机制。我们称它为块级缓存吧。如果是同一个代码块,会重复利用常量对象。
因为这个缓存是代码块内的小缓存,总共也不会有太多的对象,所以可以尽可能多的缓存对象。
看这个例子:
maishu@MacBook ~ % python
Python 3.10.0 (v3.10.0:b494f5935c, Oct 4 2021, 14:59:19) [Clang 12.0.5 (clang-1205.0.22.11)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = "麦叔"
>>> b = "麦叔"
>>> id(a)
4308804080
>>> id(b)
4308807920
>>> c = "麦叔"; d="麦叔"
>>> id(c)
4308808208
>>> id(d)
4308808208
>>>
注意观察结果:
-
a和b的地址是不同的(4308804080,4308807920),因为交互式Python中每一行代码都是独立的代码块,不会共同对象。 -
而c和d两个变量地址是相同的(4308808208),因为它们是在同一行定义的,是在同一个代码块中,会重复利用对象。
#041中麦友@CracKer提了一个问题:
pycharm里,“麦叔”为什么也是同一个地址,怎么解释?也是常量池吗?
它的原因就是:代码块缓存机制。
Pycharm在执行代码时会把整个文件作为一个代码块执行。
既然是同一个代码块,就会重用对象了。
所以两个中文的字符串”麦叔“也是同一个地址。
原文链接:http://www.zsiss.com/5559.html,转载请注明出处。
请先
!