Python疑惑之函数的作用域

函数的作用域是由定义函数的位置决定的,并不是由调用的位置决定的,这点和变量相似。

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()

注:标号数字为执行顺序

自己的一点学习心得,写的有点乱,有时间再整理下吧,有问题欢迎指正。
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值