我怎么可能在external()函数内部调用嵌套的len()函数

时间:2019-02-17 16:08:32

标签: python scope nested namespaces

我正在学习python名称空间和范围,为此,我正在遵循This教程。最终要预测下面的代码将输出什么。

a = 'global'

def outer():

    def len(in_var):
        print('called my len() function: ', end="")
        l = 0
        for i in in_var:
            l += 1
        return l

    a = 'local'

    def inner():
        global len
        nonlocal a
        a += ' variable'
    inner()
    print('a is', a)
    print(len(a))


outer()

print(len(a))
print('a is', a)

我对以上代码块的问题是:我们怎么可能在external()内部调用len()函数?那么,为什么print(len(a))调用external()内部的len()函数?

当我尝试像下面所做的那样调用嵌套函数时,它将无法工作。有人可以启发我吗?:

print("Does my Inner get called automatically if I call my outer?")

def outer():

    def inner():
        print("Yes")


outer() #A call to outer does not call inner() automatically
print(inner()) #Gives a NameError

2 个答案:

答案 0 :(得分:1)

b()函数的范围在a()函数内部定义。这意味着它位于a()内部。每当我们走到a()之外时,b()就会被破坏。因此,仅在该范围内可用。除此之外,它不可用。

def a():
    def b():
        print("inside b")
    b() // no error

a()
b() // error. As you are trying to access something which is not available there.

答案 1 :(得分:0)

我认为print(len(a))正在len(in_var)内调用函数outer()。因此,我感到困惑,因为我自己无法调用嵌套函数。然而,事实证明,print(len(a))正在调用len()内置版本,而不是outer()内部的版本。而且,不可能从嵌套函数的函数“外部”直接调用嵌套函数。案件结案。