#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. Я просмотрел ваш код, большое вам спасибо, это намного понятнее. ?я внедрю его, чтобы проверить это