Python每天3分钟 #045 – 代码块block和缓存机制

代码块和缓存机制

这是麦友@梁显浚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
>>> 

注意观察结果:

  1. a和b的地址是不同的(4308804080,4308807920),因为交互式Python中每一行代码都是独立的代码块,不会共同对象。
  2. 而c和d两个变量地址是相同的(4308808208),因为它们是在同一行定义的,是在同一个代码块中,会重复利用对象。

#041麦友@CracKer提了一个问题:

pycharm里,“麦叔”为什么也是同一个地址,怎么解释?也是常量池吗?

它的原因就是:代码块缓存机制

Pycharm在执行代码时会把整个文件作为一个代码块执行。

既然是同一个代码块,就会重用对象了。

所以两个中文的字符串”麦叔“也是同一个地址。

原文链接:http://www.zsiss.com/5559.html,转载请注明出处。

1

评论0

请先

爱分享推出ChatGPT国内镜像,无需魔法直接用!写文章,写代码,做PPT,做网站原创软文效果好到爆炸 https://chat.gcrup.com

社交账号快速登录