Понимание области видимости переменных во вложенных функциях в Python - PullRequest
2 голосов
/ 25 мая 2019

У меня есть следующие функции в Python3.7

def output_report():
    sheet_dict = {1: 'All', 2: 'Wind', 3: 'Soalr'} 
    sheet_name = sheet_dict[sheet_num]
    file_name = f'{file_name}_{sheet_name}_row_{row_num}.csv' if row_num else 
    f'{file_name}_{sheet_name}.csv'
    return file_name

def test_file(x):
    file_name = output_report(sheet_num)
    return f'{x}_{file_name}'

def good_func():
    sheet_num = 2
    row_num = 2
    a = test_file('new file')
    return a

когда я звоню: good_func()

Вызывает ошибку, которая:

NameError: имя 'sheet_num' не определено

Но если я определю sheet_name и row_num в глобальной области видимости, как,

sheet_num = 2
row_num = 2
def good_func():
    a = test_file('new file')
    return a

код работает.

Мой вопрос: Насколько я понимаю, во вложенных функциях внутренние функции начинают искать переменные у себя, а затем переходят к внешним функциям и, наконец, к глобальной области видимости. Затем я ожидал, что первая функция также будет запущена, но это не так. Что это такое? Я прочитал другие вопросы, связанные с областью действия , но не нашел ответа

1 Ответ

1 голос
/ 25 мая 2019

В вашем первом случае

def good_func():
    sheet_num = 2
    row_num = 2
    a = test_file('new file')
    return a

sheet_num и row_num являются локальными для функции good_func и, следовательно, недоступны для другой функции output_report

Но когдавы

sheet_num = 2
row_num = 2
def good_func():
    a = test_file('new file')
    return a

sheet_num и row_num становитесь глобальными переменными, доступными для всех других функций, следовательно, они также доступны в output_report

Также вложенные функции - это функции, определение которыхлежит в другой функции, например, где a доступен в inner

def outer():
    a = 1
    def inner():
        print(a)
    inner()

outer()

Вызов другой функции внутри функции, как в good_func, не делает их output_function вложенными.

...