python菜鸟求问关于嵌套函数中作用域范围应该怎么理解?,python嵌套,直接上代码def l(l


直接上代码

def l(list):    def d():        return list    return d     #运行l = l([1,2,3,4])print l()

这个情况是正常的。

问题在于d函数为什么不能传入list,然后我现在尝试了一下这个代码:

def l(list):    def d(list):        return list    return d #运行l = l([1,2,3,4])#提示错误print l()#正常print l([1,3,5,7,9])

请问这个怎么解释呢?
我个人理解的是,类似于“继承”的情况,当d函数没有参数传入的情况上,基于父函数的参数,当他需要传参了,就覆盖了???

看看LEGB原则,就会明白是怎么回事。
https://zhuanlan.zhihu.com/p/...

运行

l = l([1,2,3,4])

提示错误

print l() 这个错误是你没有传参数。

楼主需要理解的是: 作用域

case 1: 函数l返回函数d的地址,d只做为返回值,并没有被调用执行.

In [3]: print(l([1,2,3,4]))<function l.<locals>.d at 0x7f49243ece18>

     参数list传入l,作用域在函数l内,可以被d访问(注意参数是传给l的,不是d).
     
     如果要访问list.如下调用:
     
     `

    In [2]: print(l([1,2,3,4])())    [1, 2, 3, 4]
    相当于:    
    In [5]: d = l([1,2,3,4])    # 返回d的地址        In [6]: d()          #调用d,d没有参数,不需要传参    Out[6]: [1, 2, 3, 4]
case 2: 同样l返回d的地址,但此时返回的函数d需要传参(注意l的参数list和d的参数list是不一样的).   
    In [8]: d = l([1,2,3,4])  # 返回函数d的地址,参数list此时并没有用到        In [9]: d([5,6,7,8])    # 需要参数的函数d    Out[9]: [5, 6, 7, 8]    

原有代码中:

def l(list):    def d(list):        return list    return d  # <-- 这里是返回的一个要传入一个参数的函数 #运行l = l([1,2,3,4])#提示错误print l() # <-- 这里没有传入参数报错,这里的 l 是 返回的闭包 d#正常print l([1,3,5,7,9]) # <-- 这里的 l 已经不是你最初定义的 l 而是 最初 l 中返回的 d

下面的用于说明:你原来代码中的 l 指向不同:

def l(list):    def d(list):        return list    return d #运行print 'id(l) is {}'.format(id(l))l = l([1,2,3,4])#提示错误# print l()#正常print 'id(l) is {}'.format(id(l))print l([1,3,5,7,9])

代码写成这样你可能就理解了:

def l(_list):    def d(_l):        return _list + _l    return d a = l([1,2,3,4])print a([1])

最后说两点:

编橙之家文章,

评论关闭