我有此代码:
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
。
那是为什么?我以为在主作用域中声明的任何变量都是全局变量?
答案 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
关键字将变量声明为全局变量,但是由于程序难以阅读和调试,因此这被认为是不好的做法。