NameError: name 'x' is not defined Python

NameError: name 'x' is not defined Python

我正在尝试解决此错误,但找不到解决方案。实际上,这段代码在一段时间内运行良好,但突然开始出现错误:

"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 没有删除错误时,代码完全符合我的要求。所以我不确定如何调整它以让它在没有 NameError 警告的情况下工作。

任何帮助将不胜感激。谢谢!

您似乎是在函数内部通过全局变量定义变量。您需要将 price_buynumber_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)

当执行 global price_buy 时,这意味着您使用全局定义的 price_buy 在您的方法中本地定义,但是

  • price_buynumber_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 )

为什么你有这么多全球?

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

适合你吗?

如果您仍然想使用全局变量(正如其他答案所指出的,不是推荐的方法),您必须在使用它们之前给它们一个值:

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

您还没有定义那些全局变量。输入 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。尽管如果您使用 class 来保存您需要的那些值,您可能会完全避免使用全局变量,如下所示:

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