前向引用
风湿理论(函数即变量)
理论总是很抽象,我个人理解:
代码从上到下执行,一旦遇到定义的函数体,内存便为其开辟空间,并用该函数的名字作为一个标识
但是该函数体内具体是什么内容,这个时候并不着急去读取
而是在程序中需要调用执行该函数时,去执行该函数内的具体内容
如果一个函数还未开辟内存空间就先调用,就会报错
这也很好理解,因为程序都不知道这个函数放在哪里,也不知道该函数的标识是什么,
自然也不知道去哪里找它啊
我们来通过分析一个程序来看看具体含义吧
1 name = 'xhg' 2 def name1(): 3 name = 'aa' 4 print(name) 5 def name2(): 6 name = 'bb' 7 print(name) 8 def name3(): 9 name = 'cc' 10 print(name) 11 print(name) 12 name3() 13 name2() 14 print(name) 15 print(name) 16 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 '''
为了更好的理解,我画了一个图
同一个颜色为一个作用域
每一行代码前的数字代表执行的顺序