Python小白学习之路(十二)—【前向引用】【风湿理论】
前向引用
风湿理论(函数即变量)
理论总是很抽象,我个人理解:
代码从上到下执行,一旦遇到定义的函数体,内存便为其开辟空间,并用该函数的名字作为一个标识
但是该函数体内具体是什么内容,这个时候并不着急去读取
而是在程序中需要调用执行该函数时,去执行该函数内的具体内容
如果一个函数还未开辟内存空间就先调用,就会报错
这也很好理解,因为程序都不知道这个函数放在哪里,也不知道该函数的标识是什么,
自然也不知道去哪里找它啊
我们来通过分析一个程序来看看具体含义吧
name = 'xhg'
def name1():
name = 'aa'
print(name)
def name2():
name = 'bb'
print(name)
def name3():
name = 'cc'
print(name)
print(name)
name3()
name2()
print(name)
print(name)
name1()
'''
#执行结果
xhg
aa
bb
bb
cc
aa
xhg
'''
'''
#分析程序执行过程
1.执行第一行代码 name = 'xhg' 定义了全局变量
2.执行第二行代码 def name1(): 由于是定义了一个函数体,所以内存开辟了空间,并用name1作为标识,但是具体内容不进行读取
3.执行第十五行代码 print(name) 此时打印 xhg
4.执行第十六行代码 name1() 执行定义的函数name1(),所以程序到刚才内存开辟的以name1为标识的地方去读取具体内容
5.执行第三行代码 name = 'aa' 定义了局部变量
6.执行第四行代码 print(name) 从当前作用域找变量的值,所以此时打印 aa
7.执行第五行代码 def name2(): 由于是定义了一个函数体,所以内存开辟了空间,并用name2作为标识,但是具体内容不进行读取
8.执行第十三行代码 name2() 执行定义的函数name2(),所以程序到刚才内存开辟的以name2为标识的地方去读取具体内容
9.执行第六行代码 name = 'bb' 定义了局部变量
10.执行第七行代码 print(name) 从当前作用域找变量的值,所以此时打印 bb
11.执行第八行代码 def name3(): 由于是定义了一个函数体,所以内存开辟了空间,并用name3作为标识,但是具体内容不进行读取
12.执行第十一行代码 print(name) 从当前作用域找变量的值,所以此时打印 bb
13.执行第十二行代码 name3() 执行定义的函数name3(),所以程序到刚才内存开辟的以name3为标识的地方去读取具体内容
14.执行第九行代码 name = 'cc' 定义了局部变量
15.执行第十行代码 print(name) 从当前作用域找变量的值,所以此时打印 cc
16.执行第十四行代码 print(name) 从当前作用域找变量的值,所以此时打印 aa
17.执行第十七行代码 print(name) 从当前作用域找变量的值,所以此时打印 xhg
'''
为了更好的理解,我画了一个图
同一个颜色为一个作用域
每一行代码前的数字代表执行的顺序

Python小白学习之路(十二)—【前向引用】【风湿理论】的更多相关文章
- Python小白学习之路(二十二)—【生成器】
一.什么是生成器? 生成器可以理解成是一种数据类型,特殊地是生成器可以自动实现迭代器协议其他的数据类型需要调用自己内置的__iter__方法所以换种说法,生成器就是可迭代对象 !回忆:很重要的迭代器协 ...
- Python小白学习之路(二十)—【打开文件的模式二】【文件的其他操作】
打开文件的模式(二) 对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码.图片文件的jgp格 ...
- Python小白学习之路(二十六)—【if __name__ =='__main__':】【用状态标识操作】
规则一: 一个python文件中,只写一些可以运行的功能测试代码写在这句代码下面 if __name__ =='__main__': 在讲这边的时候,我不是很懂参考了一篇博客,地址如下:http:// ...
- Python小白学习之路(二十四)—【装饰器】
装饰器 一.装饰器的本质 装饰器的本质就是函数,功能就是为其他函数添加附加功能. 利用装饰器给其他函数添加附加功能时的原则: 1.不能修改被修饰函数的源代码 2.不能修改被修饰函数的调用 ...
- Python小白学习之路(二十五)—【装饰器的应用】
通过一个任务来加深对装饰器的理解和应用 回顾:装饰器的框架 def timmer(func): def wrapper(): func() return wrapper 任务:给以下正在运行的程序加一 ...
- Python小白学习之路(二)—【Pycharm安装与配置】【创建项目】【运算符】【数据类型】
写在前面: 第二天的学习,感觉比昨天学习相对轻松一些,但是对于我这个编程语言功底很弱的人来说,还是稍稍微有些.....哈尔滨的天气一天天冷了下来,还飘着小雨,不过还是挺有意境的.充实而又忙碌的生活,让 ...
- Python小白学习之路(二十一)—【迭代器】
迭代器 1.迭代器协议 对象必须提供一个 next 方法,执行该方法要么返回迭代中的下一项,要么就引起一个Stoplteration异常,以终止迭代(只能往后走不能往前退) 2.可迭代对象 实现了迭代 ...
- Python小白学习之路(二十三)—【生成器补充】
生成器的一些补充 接着下鸡蛋和吃包子! 补充一:生成器只能遍历一次 (总是把生成器比喻成母鸡下鸡蛋,需要一个下一个,首先是下出来的鸡蛋不能塞回母鸡肚子里,其次是一个母鸡一生只能下一定数量的鸡蛋,下完了 ...
- Python小白学习之路(十)—【函数】【函数返回值】【函数参数】
写在前面: 昨天早睡之后,感觉今天已经恢复了百分之八十的样子 又是活力满满的小伙郭 今日份鸡汤: 我始终相信,在这个世界上,一定有另一个自己,在做着我不敢做的事,在过着我想过的生活.-------宫崎 ...
随机推荐
- 2018.09.07 loj#10166 数字游戏(数位dp)
传送门 数位dp板子题. f[i][mod]" role="presentation" style="position: relative;"> ...
- 2018.07.06 BZOJ 1588: HNOI2002营业额统计(非旋treap)
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MB Description 营业额统计 Tiger最近被公司升任为营业部经理,他上 ...
- ABP框架 - 缓存( 转)
出处:http://www.cnblogs.com/kid1412/p/5987083.html 文档目录 本节内容: 简介 ICacheManager ICache ITypedCache 配置 实 ...
- json、JSONObject、JSONArray的应用
type.java package jiekou.duixiang; import java.text.ParseException;import java.text.SimpleDateFormat ...
- 怎样使用word2013发布csdn博客
目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写 ...
- not allowed to access to crontab because of pam configuration
如果运行crontab如遇下面这样的错误: $ crontab -l You (zhangsan) are not allowed to access to (crontab) because of ...
- WriteableBitmap(二) 实例
使用前面定义的WriteableBitmap,我们可以很容易地创建一个足够容纳整个100 x 100图像的数组: byte[] pixels = new byte[wbmap.PixelHeight* ...
- 关于BufferefReader.readLine()方法的理解
有以下代码: BufferedReader localReader = new BufferedReader(new InputStreamReader(System.in)); String ...
- centos7 磁盘管理—— lvm的使用
Linux用户安装Linux操作系统时遇到的一个常见的难以决定的问题就是如何正确地评估各分区大小,以分配合适的硬盘空间.普通的磁盘分区管理方式在逻辑分区划分好之后就无法改变其大小,当一个逻辑分区存放不 ...
- java web 中的WEB-INF文件夹
WEB-INF下的东西是禁止直接访问的.如果这个页面是你的,要想让人访问最好不要放在这个目录下.如果一定放在那里.你可以使用:request.getRequestDispatcher("/W ...