Как это возможно, что я могу вызвать вложенную функцию len () внутри функции external () - PullRequest
0 голосов
/ 17 февраля 2019

Я изучаю пространство имен и область применения Python, и для этого я следую Это Учебное пособие.Это заканчивается задачей предсказать, что выведет следующий код.

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)

Мой вопрос о блоке кода выше: как это возможно, что мы можем вызвать функцию len () внутри external ()?Итак, почему print (len (a)) вызывает функцию len () внутри external ()?

Когда я пытаюсь вызвать вложенную функцию, как я это делал ниже, она не будет работать.Может ли кто-нибудь просветить меня?:

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 голосов
/ 18 февраля 2019

Я думал, что print(len(a)) вызывает функцию len(in_var) внутри outer().Поэтому я запутался, потому что не мог сам вызывать вложенные функции.Однако, как выясняется, print(len(a)) вызывает встроенную версию len(), а не ту, что внутри outer().И невозможно напрямую вызывать вложенные функции "снаружи" функции, внутри которой эта функция вложена.Дело закрыто.

0 голосов
/ 17 февраля 2019

Область действия функции b () определяется внутри функции ().Это означает, что он живет внутри ().Всякий раз, когда мы выходим за пределы 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.
...