【问题标题】:Why does it say UnboundLocalError: local variable 'max_range' referenced before assignment When i have assigned it为什么它说 UnboundLocalError: local variable 'max_range' referenced before assignment 当我分配它时
【发布时间】:2020-09-02 11:38:59
【问题描述】:

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

array = [1, 11, 3, 0, 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]
    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([1, 11, 3, 0, 15, 5, 2, 4, 10, 7, 12, 6])

【问题讨论】:

  • 我不明白
  • 另外我的意思是保留原始代码(否则问题的标题没有意义),而是在下面添加修改后的代码
  • soooooooo 你能不能编辑问题,使其正确。请
  • 哦,不好意思,现在我该怎么办??
  • 好的,我会这样做的

标签: python python-3.x local-variables


【解决方案1】:

在 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

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

【讨论】:

  • 但是当它给出文件“/tester/program.py”,第 23 行,运行 print(max_range) NameError: name 'max_range' is not defined
  • @Mehul:不...错误是UnboundLocalError: local variable 'max_range' referenced before assignment。对于第一个示例,您将收到关于 x 的相同错误。 Python 决定它是本地的,但如果你在赋值之前使用它,它会给出你得到的错误。
  • 我很困惑,我现在该怎么办??请告诉我,我对 python 很陌生
  • 哦,等一下,我会这样做的
【解决方案2】:

max_rangeglobal 范围内定义。所以“默认”它在函数的本地范围内也是可见的。

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

然而,使max_range = Range inside 函数,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

EDIT(编辑问题)

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)
    ...

【讨论】:

  • 但是我该如何做出改变
  • 使用global关键字查看6502的答案
猜你喜欢
  • 2017-08-08
  • 2019-07-11
  • 2013-02-11
  • 2021-05-11
  • 1970-01-01
  • 2023-02-13
  • 2018-01-22
  • 2021-12-17
  • 1970-01-01
相关资源
最近更新 更多