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小白学习之路(十)—【函数】【函数返回值】【函数参数】
写在前面: 昨天早睡之后,感觉今天已经恢复了百分之八十的样子 又是活力满满的小伙郭 今日份鸡汤: 我始终相信,在这个世界上,一定有另一个自己,在做着我不敢做的事,在过着我想过的生活.-------宫崎 ...
随机推荐
- 库函数方式文件编程----fopen
使用fopen等文件访问库函数编写应用程序,该应用程序实现文件的复制功能. 1.打开文件---fopen 函数功能:打开文件 头文件:#include<stdio.h> 函数原型:FILE ...
- Android系统root破解原理分析
http://dengzhangtao.iteye.com/blog/1543494 root破解过程的终极目标是替换掉系统中的su程序.但是要想替换掉系统中su程序本身就是需要root权限的,怎样在 ...
- 博客停更转战简书http://www.jianshu.com/u/7ac4047c9cfa
博客停更转战简书 http://www.jianshu.com/u/7ac4047c9cfa
- 2018.09.30 bzoj2821: 作诗(Poetize)(分块)
传送门 分块经典题目. 先将数列分块. 然后预处理出每两个块之间有多少个数出现了正偶数次. 这样查询的时候对于中间的完整块直接用预处理出的数组搞定. 剩下的暴力枚举求解. 代码: #include&l ...
- hdu-1171(多重背包+二进制优化)
题目链接: 思路:找每次最多装一半的情况,注意数组范围,前几次dp开小了,一直RE. #include<iostream> #include<cstdio> #include& ...
- [GO]kafka的生产者和消费者
生产者: package main import ( "github.com/Shopify/sarama" "fmt" "time" ) ...
- C语言程序设计50例(一)(经典收藏)
[程序1]题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?1.程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去 掉不满足条件的排列. # ...
- linux week3
2.如何快速的回到 上⼀一次所在的位置 cd An argument of - is equivalent to $OLDPWD. cd - #cd $OLDPWD cd - #快速的回到 上 ...
- Can not issue data manipulation statements with executeQuery().
这个错误提示是说无法发行sql语句到指定的位置 就是如图的两端代码的问题,excuteQuery是查询语句,而我要调用的是更新的语句,所以这样数据库很为难到底要干嘛,我实际的操作是要更新数据,所以把 ...
- 学习前端的菜鸡对JS的call,apply,bind的通俗易懂理解
call,apply,bind 在JavaScript中,call.apply和bind是Function对象自带的三个方法,都是为了改变函数体内部 this 的指向. a ...