Ошибка имени: имя «x» не определено Python

#python #list #random #var #nameerror

Вопрос:

Я пытаюсь обойти эту ошибку, но не могу найти решение. На самом деле код некоторое время работал отлично, но неожиданно начал выдавать ошибку:

 "NameError: name 'number_exit' is not defined" 
 

А также:

 "NameError: name 'price_buy' is not defined"
 

Код генерирует список случайных чисел

 import numpy as np

# This function generates a list of numbers under certain rules
def num_var_list():
    global number_list, number_exit, number_target
    number_list = []
    number_target = number_exit
    num_max_robot = (number_target * 20) / 100
    while num_max_robot > 0:
        num_robot = np.random.randint(1,int(num_max_robot))
        if num_robot > number_target:
                number_list.append(number_target)
        else: 
            number_list.append(num_robot)
        number_target = number_target - number_target
    return number_list
        
# This function generates a random number between a certain range
def fun_price_buy():
    global price_buy
    price_buy = np.random.randint(50000,300000)
    return price_buy

# This function generates a random number between a certain range
def fun_mx_buy():
    global number_exit
    number_exit = np.random.randint(50, 150)
    return number_exit

lista_number_list = []
lista_price_buy = []
lista_mx_buy = []

# This loop append each function 50 times to a new list
while len(lista_price_buy) <= 50: 
    lista_number_list.append(num_var_list())
    lista_price_buy.append(fun_price_buy())
    lista_mx_buy.append(fun_mx_buy())
 

На самом деле, когда Python ошибка не устраняется, код делает именно то, что я хочу, чтобы он делал. Поэтому я не знаю, как настроить его, чтобы он работал без предупреждений об ошибке имени.

Любая помощь будет высоко оценена. Спасибо!

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

1. Вы должны начать передавать аргументы своим функциям, вместо того, чтобы злоупотреблять global , пытаясь ввести переменные в область видимости

2. кроме того, вы не определили их вне области функций, так что global не будет работать

3. num_var_list не может работать, вы никогда не меняете значение num_max_robot в цикле, так что, похоже, это бесконечные циклы

4. @azro не бесконечный цикл. На самом деле даже работает, когда я определяю переменные с помощью «глобального» . Но иногда Python начинает отбрасывать ошибки имен и останавливать работу.. Я хотел бы знать, как определить эти значения вне функций, поскольку функции генерируют случайные значения для этих переменных..

Ответ №1:

При этом global price_buy это означает, что вы используете глобально определенное price_buy , которое должно быть определено локально в вашем методе, но

  • price_buy ни number_exit то, ни другое не определено глобально (вне метода)
  • вам не нужна глобальная переменная

Они должны быть только местными, и только лучше : встроенными

 def fun_price_buy():
    price_buy = np.random.randint(50000,300000)
    return price_buy

# inline, no temporaty variable is needed
def fun_price_buy():
    return np.random.randint(50000,300000)
 

Наконец, и если вы хотите получить значение из метода в переменной, чтобы что-то с ним сделать:

 import numpy as np

# This function generates a list of numbers under certain rules
def num_var_list(number_exit):
    number_list = []
    number_target = number_exit
    num_max_robot = (number_target * 20) / 100
    while num_max_robot > 0:
        num_robot = np.random.randint(1,int(num_max_robot))
        if num_robot > number_target:
                number_list.append(number_target)
        else: 
            number_list.append(num_robot)
        number_target = number_target - number_target
    return number_list
        
def fun_price_buy():
    return np.random.randint(50000,300000)

def fun_mx_buy():
    return np.random.randint(50, 150)

lista_number_list = []
lista_price_buy = []
lista_mx_buy = []

# This loop append each function 50 times to a new list
while len(lista_price_buy) <= 50: 
    number_exit = fun_mx_buy()
    price_buy = fun_price_buy()
    vr_list = num_var_list(number_exit)
   
    lista_number_list.append(vr_list)
    lista_price_buy.append(price_buy )
    lista_mx_buy.append(number_exit )
 

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

1. Спасибо, но мне нужно позже вспомнить переменные, поэтому не называйте их так, чтобы это не подходило для моей цели..

2. @Foldhy Зачем использовать переменную, вы храните данные в списке ? Это плохое использование для сохранения переменной в одном методе и вызова переменной в другом методе. Пожалуйста, объясните свой способ использования (желательно в вашем первоначальном сообщении)

3. Привет @azro Код предназначен для сценария моделирования, так что да, мне нужно хранить данные в списках, а затем создать словарь и фрейм данных для изучения данных. Некоторые функции создают список, а другие просто создают значение, которое позже сохраняется в списке. Поэтому я пока не понимаю, как определять переменные без использования «глобальных», даже потому, что переменные меняют свое значение с момента генерации случайных чисел..

4. Да, наконец, лучшее решение-это то, на которое вы указали. Чтобы вызвать переменные вне функции, указав их имя функции в качестве значения. Отлично, спасибо!

Ответ №2:

почему у вас так много глобального ?

 def num_var_list():
    number_exit=fun_mx_buy()
    number_list = []
    number_target = number_exit
    num_max_robot = (number_target * 20) / 100
    while num_max_robot > 0:
        num_robot = np.random.randint(1, int(num_max_robot))
        if num_robot > number_target:
            number_list.append(number_target)
        else:
            number_list.append(num_robot)
        number_target = number_target - number_target
    return number_list
 

это работает для вас?

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

1. Правка: вызов функции переменных изменяет циклы..

Ответ №3:

Похоже, что вы определяете переменные с помощью глобалов внутри функции. Вы захотите преобразовать свои price_buy и number_exit в локальные переменные.

или:

 # This function generates a random number between a certain range
def fun_price_buy():
    return np.random.randint(50000,300000)

# This function generates a random number between a certain range
def fun_mx_buy():
    return np.random.randint(50, 150)
 

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

1. Привет, спасибо. Но мне нужно, чтобы переменные были названы, чтобы повторно вызвать их позже..

2.Затем вы называете их там, где они вам нужны, когда вызываете функцию. variable1 = fun_price_buy() variable2 = fun_mx_buy() и т.д. Вы можете прочитать больше о области видимости переменных здесь: w3schools.com/python/python_scope.asp

Ответ №4:

Если вы все еще хотите использовать глобальные переменные (как указывалось в других ответах, это не рекомендуемый подход), вам придется указать им значение перед их использованием:

 number_exit = 0
# This function generates a list of numbers under certain rules
def num_var_list():
    global number_list, number_exit, number_target
    number_list = []
 

Вы также можете создать экземпляр number_exit в области действия функции, но вам нужно сделать это перед ее фактическим использованием.

 # This function generates a list of numbers under certain rules
def num_var_list():
    global number_list, number_exit, number_target
    number_list = []
    number_exit = 0
 

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

1. Здравствуйте, на самом деле это не решает проблему, потому что при этом позже в коде я получаю эту ошибку ZeroDivisionError: деление на ноль

Ответ №5:

Вы не определили эти глобальные переменные. Ввод global whatever текста не определяет автоматически вызываемую переменную whatever . Он просто сообщает интерпретатору, что существует существующая переменная, называемая whatever в глобальной области видимости.

Например, следующий код не выдает ошибок:

 blah = 'yada'

def foo(bar):
    global blah
    print(blah, bar)
    
foo('test') # output: yada test
 

В то время как в этом примере, если глобальная переменная не определена заранее (я ее прокомментировал), она получает ту же ошибку, что и вы:

 #blah = 'yada'

def foo(bar):
    global blah
    print(blah, bar)
    
foo('test') # output: NameError: name 'blah' is not defined
 

Итак, чтобы перестать получать ошибку, вы должны заранее присвоить своим глобальным переменным какое-то значение, например None . Хотя вы могли бы вообще избегать глобалов, если бы использовали класс для хранения нужных вам значений, как это:

 import numpy as np

class MyClass(object):
    def __init__(self):
        #you'll have to set the numerical values to something that causes num_var_list to not loop infinitely
        self.number_list = None
        self.number_exit = 0
        self.number_target = 0
        self.price_buy = 0

    # This function generates a list of numbers under certain rules
    def num_var_list(self):
        self.number_list = []
        self.number_target = self.number_exit
        num_max_robot = (self.number_target * 20) / 100
        while num_max_robot > 0:
            num_robot = np.random.randint(1,int(num_max_robot))
            if num_robot > self.number_target:
                    self.number_list.append(self.number_target)
            else: 
                self.number_list.append(num_robot)
            self.number_target = self.number_target - self.number_target
        return self.number_list
            
    # This function generates a random number between a certain range
    def fun_price_buy(self):
        self.price_buy = np.random.randint(50000,300000)
        return self.price_buy

    # This function generates a random number between a certain range
    def fun_mx_buy(self):
        self.number_exit = np.random.randint(50, 150)
        return self.number_exit

def main():
    lista_number_list = []
    lista_price_buy = []
    lista_mx_buy = []
    
    my_class_instance = MyClass()

    # This loop append each function 50 times to a new list
    while len(lista_price_buy) <= 50: 
        lista_number_list.append(my_class_instance.num_var_list())
        lista_price_buy.append(my_class_instance.fun_price_buy())
        lista_mx_buy.append(my_class_instance.fun_mx_buy())

if __name__ == '__main__':
    main()
 

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

1. Здравствуйте, спасибо за комментарии. Итак, вы предполагаете, что другим решением является использование класса для определения переменных? Не могли бы вы просто привести пример?

2. @Foldhy хорошо, я обновил свой пост примером использования класса для хранения глобальных переменных для вашей программы. Она должна быть идентична вашей программе, за исключением того, что вы не используете перчатки. Хотя, когда я запустил его, чтобы убедиться, что он работает, программа бесконечно зацикливалась. Я думаю, это связано с тем, что num_var_list() запускался до двух других функций, хотя он полагается на те функции, которые придают значение number_exit и price_buy . В вашем __init__ случае вы могли бы инициализировать эти переменные, например, с помощью соответствующих функций self.price_buy = fun_price_buy() .

3. Я просмотрел ваш код, большое вам спасибо, это намного понятнее. ?я внедрю его, чтобы проверить это