为什么将此变量视为本地变量?

时间:2019-12-01 13:58:53

标签: python python-3.x

我有此代码:

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

那是为什么?我以为在主作用域中声明的任何变量都是全局变量?

3 个答案:

答案 0 :(得分:2)

total_mass += fuel_for_mass

可以认为等同于

total_mass = total_mass + fuel_for_mass

给出这样的设置,python会看到一个在本地范围内(在函数内部)变量的赋值。

对此行为的最小说明可以看如下:

var = 42
def f():
    var = var + 1
#    var += 1 would also show the same behaviour

f() #UnboundLocalError: local variable 'var' referenced before assignment

Python推断存在一个局部变量total_mass,因为它在局部范围内看到了对该变量的赋值。 但是,尚未为局部变量total_mass分配值, 因此您会看到如图所示的错误。

您可以在分配之前使用global关键字来访问全局范围内的变量,如下所示:

var = 42
def f():
    global var
    var = var + 1

f() #var is now 43 in global scope

答案 1 :(得分:0)

在函数开始时,放

global total_mass

答案 2 :(得分:-1)

为此,您必须知道Python中的变量作用域和可变/不可变类型如何工作。 int类型是不可变的,因此,当您尝试在函数中对其进行“修改”时,实际上将创建一个具有局部范围的新变量。正如编译器看到的那样,变量将是函数的局部变量,它假定您要首先访问局部变量,而不是全局变量。可以使用global关键字将变量声明为全局变量,但是由于程序难以阅读和调试,因此这被认为是不好的做法。