Почему эта переменная считается локальной? - PullRequest
2 голосов
/ 01 декабря 2019

У меня есть этот код:

with open("01-1-input.txt", "r") as f:
inputs = [int(i[:-2] if i[-1] == "n" else i) for i in f.readlines()]

total_mass = 0

def calculate_fuel_for_mass(mass):
    fuel_for_mass = mass // 3 - 2
    if fuel_for_mass > 0:
        total_mass += fuel_for_mass
        calculate_fuel_for_mass(fuel_for_mass)
    else:
        return 0

for i in inputs:
    calculate_fuel_for_mass(i)

print(total_mass)

И он выбрасывает UnboundLocalError: local variable 'total_mass' referenced before assignment.

Почему это так? Я думал, что любая переменная, объявленная в основной области видимости, является глобальной?

Ответы [ 2 ]

0 голосов
/ 01 декабря 2019

Для этого вы должны знать, как работают переменные области видимости и непостоянные / неизменяемые типы в Python. Тип int является неизменным, поэтому, когда вы пытаетесь «изменить» его в функции, вы по существу создаете новую переменную с локальной областью видимости. Поскольку компилятор может видеть, что переменная будет локальной для функции, она предполагает, что вы хотите получить доступ к локальной переменной в первую очередь, а не к глобальной. Можно объявить глобальную переменную с помощью ключевого слова global, однако это считается плохой практикой, поскольку программу становится сложнее читать и отлаживать.

0 голосов
/ 01 декабря 2019

В начале вашей функции введите

global total_mass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...