为什么说UnboundLocalError:在分配之前引用了本地变量'max_range' 编辑对已编辑的问题

问题描述

为什么我已经分配了它,却说“未定义名称'max_range'”。 这是对https://www.algoexpert.io/questions/Largest%20Range的问题的尝试 示例数组:

array = [1,11,3,15,5,2,4,10,7,12,6]

def largestRange(array):
    # Write your code here.
    sub_array = array # substitute array as it will be modified later3
    Range = [0,0]
    max_range = [0,0]
    
    def run() :
        global max_range
        num = min(sub_array)
        Range = [num]
        running = True
        while running :
            num += 1
            if num not in sub_array :
                Range.append(num - 1)
                running = False
                pass
            else :
                sub_array.remove(num)
                pass
            pass
        print(Range)
        print(max_range)
        if (max_range[1] - max_range[0]) <= (Range[1] - Range[0]) :
            max_range = Range
        if len(sub_array) != 0:
            run()
        pass
    
    run()
    print(max_range)
    return max_range
    pass
largestRange(array)

完整错误

name 'max_range' is not defined
Traceback (most recent call last):
  File "/tester/json_wrapper.py",line 9,in run
    actual = program.largestRange(array[:])
  File "/tester/program.py",line 30,in largestRange
    run()
  File "/tester/program.py",line 23,in run
    print(max_range)
NameError: name 'max_range' is not defined

堆栈溢出表示我的问题主要是代码,所以我只是写了这一行,以便我发布问题

示例可复制代码

def largestRange(array):
    # Write your code here.
    sub_array = array  # substitute array as it will be modified later3
    Range = [0,0]

    def run():
        global max_range
        num = min(sub_array)
        Range = [num]
        running = True
        while running:
            num += 1
            if num not in sub_array:
                Range.append(num - 1)
                running = False
                pass
            else:
                sub_array.remove(num)
                pass
            pass
        print(Range)
        print(max_range)
        if (max_range[1] - max_range[0]) <= (Range[1] - Range[0]):
            max_range = Range
        if len(sub_array) != 0:
            run()
        pass

    run()
    print(max_range)
    return max_range


pass
largestRange([1,6])

解决方法

max_range全局范围内定义。因此,“通过默认”在函数的本地范围内也是可见的。

max_range = whatever
def run():
    ....
    print(max_range) # OK

但是,将max_range = Range置于函数内部 ,则将max_range视为函数的 local 变量,即在所有函数中与全局max_range

没有关系
max_range = whatever
def run():
    ....
    print(max_range) # error,because local max_range has not been declared yet
    max_range = Range # this makes max_range local

编辑(对已编辑的问题)

global关键字适用于全局变量。在代码中,您在函数内部定义了max_range(不在全局范围内),并且您想在内部函数内部进行更改。您可以实现此目标通过将其作为参数并返回修改后的值:

def largestRange(array):
    ...
    max_range = [0,0]
    def run(max_range):
        ... # the code you have
        return max_range
    max_range = run(max_range)
    ...
,

在Python中,默认情况下,分配给该变量的变量被视为局部变量...即在

x = 3

def foo():
    print(x)   # <--- error: x is considered a local
               # because of next statement,but at this
               # point it has not yet received any value
    x = 5

如果要更改全局变量,则需要通知编译器:

x = 3

def foo():
    global x # <--- this informs x is global even if there are assignments
    print(x) # <--- prints the global
    x = 5 # <--- ok,this changes the global

如果从未写入变量,则编译器会假定它是从外部范围或全局范围捕获的。