Почему он говорит UnboundLocalError: локальная переменная ‘max_range’, на которую ссылаются перед назначением, когда я ее назначил

#python #python-3.x #local-variables

#python #python-3.x #локальные переменные

Вопрос:

Почему в нем говорится «имя ‘max_range’ не определено», когда я уже назначил его. это попытка задать вопрос оhttps://www.algoexpert.io/questions/Largest Range пример массива:

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

Комментарии:

1. я не понял

2. Также я имел в виду оставить исходный код (в противном случае название вопроса не имеет смысла), но добавить измененный код ниже

3. тааак не могли бы вы, пожалуйста, отредактировать вопрос, чтобы он был правильным. ПОЖАЛУЙСТА

4. ох, sryy теперь, что мне делать??

5. хорошо, я сделаю это

Ответ №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
  

Если переменная никогда не записывается, компилятор предполагает, что она захвачена из внешней области или глобальной.

Комментарии:

1. но когда он выдает File «/tester/program.py «, строка 23, в run print(max_range) NameError: имя ‘max_range’ не определено

2. @Mehul: нет … ошибка UnboundLocalError: local variable 'max_range' referenced before assignment . В первом примере вы получите ту же ошибку, что и x . Python решил, что это локальная, но если вы используете ее перед назначением, она выдает полученную вами ошибку.

3. я в замешательстве, что мне теперь делать?? скажите, пожалуйста, я очень новичок в python

4. о, подождите, я это сделаю

Ответ №2:

max_range определяется в глобальной области видимости. Таким образом, «по умолчанию» она также видна в локальной области видимости функции.

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

Однако, создание max_range = Range внутри функции, max_range затем рассматривается как локальная переменная для функции, т. Е. В функции all она не имеет ничего общего с глобальной 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)
    ...
  

Комментарии:

1. но как мне внести изменения

2. Смотрите ответ 6502 с использованием global ключевого слова