函数的作用域是由定义函数的位置决定的,并不是由调用的位置决定的,这点和变量相似。
name = 'alex' def foo(): name = 'wupeiqi' def bar(): name = "mary" print(name) return bar #只是把函数bar的内存地址返回了,但不执行函数bar() bar = foo() #bar得到了函数bar的内存地址,所以bar()就相当于执行了函数bar(),要想执行只需加括号即可,即下面为执行 bar() #foo()()相当于 bar = foo() 和 bar()这两步的操作代码
bar 与 bar()的区别:bar只是一个地址,而bar()是执行函数bar。
foo()()中的限制性foo()会返回bar的地址,让后再加一个括号就相当于执行了bar(),因此输出name的值。
return 函数名 只是返回函数的地址,如要执行需加括号,如:函数名()
代码最后一行在全局的位置调用执行了函数bar,打印变量name输出结果,好像应该输出alex,但由于函数bar定义位置的原因打印的是mary。也就是调用决定不了作用域,而是由定义的位置来决定。
return 函数名容易出错的地方,也是Python代码执行的顺序来决定
1.name = 'alex' 2.def foo(): #加载函数foo 3.1name = 'wupeiqi' 3.2def bar(): #加载函数bar name = "mary" print(name) def tt(): print("OK") return tt #return tt,放在这里就不会报错,因为函数tt已被加载有地址了 3.3return tt #会报错,函数tt并没有被加载,也就是找不到函数tt的地址 """这时要返回函数的地址是错误的,因为执行函数bar()时, 会把bar中所有代码一次性放进bar的地址中,并没有执行函数tt呢 只是会把tt函数中的代码段当成字符来处理(并没有当成函数来处理), 只有执行到当前层的时候才会有内存地址,因此Python会报错""" 3.bar = foo() bar()
注:标号数字为执行顺序
自己的一点学习心得,写的有点乱,有时间再整理下吧,有问题欢迎指正。