【问题标题】:NameError: name 'x' is not defined PythonNameError:名称'x'未定义Python
【发布时间】:2021-04-02 18:23:41
【问题描述】:

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

"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 警告的情况下工作。

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

【问题讨论】:

  • 你应该开始向你的函数传递参数,而不是滥用global来尝试将变量放入作用域
  • 另外,您还没有将它们定义在函数范围之外,因此全局无法正常工作
  • num_var_list 不能工作,你永远不会在循环中改变num_max_robot 的值,所以这似乎是一个无限循环
  • @azro 不是无限循环。当我使用 "global" 定义变量时,甚至可以实际工作。但有时 Python 开始删除 NameErrors 并开始工作..我想知道如何在函数之外定义这些值,因为函数会为这些变量生成随机值..

标签: python list random var nameerror


【解决方案1】:

在执行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 )

【讨论】:

  • 谢谢,但我需要稍后回忆变量,所以不要命名不适合我的目的..
  • @Foldhy 为什么使用变量,将数据存储在列表中?在一种方法中保存变量并在另一种方法中调用变量是不好的。请解释您的用例(最好在您的初始帖子中)
  • 嗨@azro 该代码用于模拟场景,所以是的,我需要将数据存储到列表中,然后创建一个字典和一个 DataFrame 来探索数据。一些函数创建一个列表,而其他函数只是创建一个稍后存储到列表中的值。所以我还不明白如何在不使用“全局”的情况下定义变量,即使因为生成随机数后变量会改变它们的值..
  • 是的,最后最好的解决方案就是你指出的那个。在函数外部调用变量,提供它们的函数名作为值。完美,谢谢!
【解决方案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

它适合你吗?

【讨论】:

  • 编辑:调用变量函数会改变循环..
【解决方案3】:

看起来您正在通过函数内部的全局变量定义变量。您需要将 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)

【讨论】:

  • 您好,谢谢。但我需要命名变量以便稍后重新调用它们..
  • 然后在调用函数时在需要的地方命名。 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

【讨论】:

  • 你好,并没有真正解决问题,因为这样做,稍后在代码中我得到这个 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()

【讨论】:

  • 您好,感谢您的评论。所以你建议另一个解决方案是使用一个类来定义变量?你能举个例子吗?
  • @Foldhy 好的,我更新了我的帖子,其中提供了一个使用类来保存程序的全局变量的示例。除了不使用手套外,它应该与您的程序相同。虽然当我运行它以确保它工作时,程序无限循环。我认为这是因为num_var_list() 在其他两个函数之前运行,即使它依赖于那些为number_exitprice_buy 赋值的函数。在您的__init__ 中,您可以使用相应的函数初始化这些变量,例如self.price_buy = fun_price_buy()
  • 我已经浏览了你的代码,非常感谢你更清楚了。 ?我会执行它来检查它
猜你喜欢
  • 1970-01-01
  • 2022-09-30
  • 1970-01-01
  • 2019-11-06
  • 2013-01-26
  • 1970-01-01
  • 2013-08-14
  • 2020-09-04
相关资源
最近更新 更多