前向引用

风湿理论(函数即变量)

理论总是很抽象,我个人理解:

代码从上到下执行,一旦遇到定义的函数体,内存便为其开辟空间,并用该函数的名字作为一个标识
但是该函数体内具体是什么内容,这个时候并不着急去读取
而是在程序中需要调用执行该函数时,去执行该函数内的具体内容
如果一个函数还未开辟内存空间就先调用,就会报错
这也很好理解,因为程序都不知道这个函数放在哪里,也不知道该函数的标识是什么,
自然也不知道去哪里找它啊

我们来通过分析一个程序来看看具体含义吧

 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小白学习之路(十二)—【前向引用】【风湿理论】的更多相关文章

  1. Python小白学习之路(二十二)—【生成器】

    一.什么是生成器? 生成器可以理解成是一种数据类型,特殊地是生成器可以自动实现迭代器协议其他的数据类型需要调用自己内置的__iter__方法所以换种说法,生成器就是可迭代对象 !回忆:很重要的迭代器协 ...

  2. Python小白学习之路(二十)—【打开文件的模式二】【文件的其他操作】

    打开文件的模式(二) 对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码.图片文件的jgp格 ...

  3. Python小白学习之路(二十六)—【if __name__ =='__main__':】【用状态标识操作】

    规则一: 一个python文件中,只写一些可以运行的功能测试代码写在这句代码下面 if __name__ =='__main__': 在讲这边的时候,我不是很懂参考了一篇博客,地址如下:http:// ...

  4. Python小白学习之路(二十四)—【装饰器】

    装饰器 一.装饰器的本质 装饰器的本质就是函数,功能就是为其他函数添加附加功能. 利用装饰器给其他函数添加附加功能时的原则: 1.不能修改被修饰函数的源代码        2.不能修改被修饰函数的调用 ...

  5. Python小白学习之路(二十五)—【装饰器的应用】

    通过一个任务来加深对装饰器的理解和应用 回顾:装饰器的框架 def timmer(func): def wrapper(): func() return wrapper 任务:给以下正在运行的程序加一 ...

  6. Python小白学习之路(二)—【Pycharm安装与配置】【创建项目】【运算符】【数据类型】

    写在前面: 第二天的学习,感觉比昨天学习相对轻松一些,但是对于我这个编程语言功底很弱的人来说,还是稍稍微有些.....哈尔滨的天气一天天冷了下来,还飘着小雨,不过还是挺有意境的.充实而又忙碌的生活,让 ...

  7. Python小白学习之路(二十一)—【迭代器】

    迭代器 1.迭代器协议 对象必须提供一个 next 方法,执行该方法要么返回迭代中的下一项,要么就引起一个Stoplteration异常,以终止迭代(只能往后走不能往前退) 2.可迭代对象 实现了迭代 ...

  8. Python小白学习之路(二十三)—【生成器补充】

    生成器的一些补充 接着下鸡蛋和吃包子! 补充一:生成器只能遍历一次 (总是把生成器比喻成母鸡下鸡蛋,需要一个下一个,首先是下出来的鸡蛋不能塞回母鸡肚子里,其次是一个母鸡一生只能下一定数量的鸡蛋,下完了 ...

  9. Python小白学习之路(十)—【函数】【函数返回值】【函数参数】

    写在前面: 昨天早睡之后,感觉今天已经恢复了百分之八十的样子 又是活力满满的小伙郭 今日份鸡汤: 我始终相信,在这个世界上,一定有另一个自己,在做着我不敢做的事,在过着我想过的生活.-------宫崎 ...

随机推荐

  1. part1:14-开发板介绍和开发板系统安装准备

    开发板介绍: Norflash与nandflash都充当硬盘,前者容量小,速度快,价格高:后者容量大,速度相对慢,价格低. 一般把这些系统都安装到nandflash里面. 1.安装到nandflash ...

  2. DB2数据类型(抄袭)

    数字 数据类型        精度          最小值                                        最大值                       smal ...

  3. CSS 关键的基础知识

    今晚看了 百度传课 一门关于CSS的课程, 感觉不错, 随手记了点儿笔记, 供以后查阅. =================================================== pos ...

  4. hdu-1171(多重背包+二进制优化)

    题目链接: 思路:找每次最多装一半的情况,注意数组范围,前几次dp开小了,一直RE. #include<iostream> #include<cstdio> #include& ...

  5. CentOS里vim基本操作

    1.关于退出 :wq!  ----强制保存退出 :wq  ---- 保存退出 :x   ----- 作用和:wq 一样 ZZ  ---- 作用和:wq一样,(注意Z是大写的,并且不是在命令模式) :q ...

  6. Linux 随记

    通配符和文件名变量:* ? [] * 查询 $ ls doc1 doc2 document mydoc monday $ ls doc* doc1 doc2 document $ ls  *day m ...

  7. 给Notepad++换主题

    Notepad++是一款不错的编辑器,很轻巧,我很喜欢它.再换个主题,加个代码高亮,看上去就更专业了.如果你是Mac用户,应该听说或使用过Textmate(什么?没听过,那你该补课了!),Textma ...

  8. java 泛型的类型擦除和桥方法

    oracle原文地址:https://docs.oracle.com/javase/tutorial/java/generics/erasure.html 在Java中,泛型的引入是为了在编译时提供强 ...

  9. MyEclipse2014中Java类右键Run as没有JUnit Test

    Java初学,想试试连接本地数据库,按照百度经验中的方法,在最后执行测试的卡住了,为啥?因为MyEclipse中右键Run as没有JUnit Test选项! 6.1.测试数据库mysql是在项目中连 ...

  10. 个人项目:实现wc.exe(Java)

    本项目Github地址:https://github.com/NNewBoy/wc 项目相关要求 基本功能:(已实现) -c 统计文件字符数 -w 统计文件词的数目 -l 统计文件行数 扩展功能:(已 ...