Maison  >  Article  >  développement back-end  >  Comment résoudre l'erreur Python NameError : le nom 'X' n'est pas défini

Comment résoudre l'erreur Python NameError : le nom 'X' n'est pas défini

王林
王林avant
2023-04-28 12:22:151644parcourir

Python "NameError : le nom n'est pas défini" se produit lorsque nous essayons d'accéder à une variable ou une fonction non définie, ou avant qu'elle ne soit définie.

Pour corriger cette erreur, nous devons nous assurer de ne pas avoir mal orthographié le nom de la variable et y accéder après l'avoir déclaré.

Assurez-vous de ne pas avoir mal orthographié une variable ou une fonction

Vous trouverez ci-dessous l'exemple de code qui produit l'erreur ci-dessus.

employee = {
    'name': 'Jiyik',
    'age': 30,
}

# ⛔️ NameError: name 'Employee' is not defined. Did you mean: 'employee'?
print(Employee) # ????️ 拼写错误的变量名

Comment résoudre lerreur Python NameError : le nom X nest pas défini

Le problème est que nous avons mal orthographié le nom de la variable. Notez que les noms de variables, de fonctions et de classes sont sensibles à la casse.

Pour corriger l'erreur dans ce cas, nous devons épeler correctement le nom de la variable.

employee = {
    'name': 'Jiyik',
    'age': 30,
}

print(employee)

«

Accédez à une variable, une fonction ou une classe avant de la déclarer.

  • Le nom d'une variable, d'une fonction ou d'une classe est mal orthographié (les noms sont sensibles à la casse).

  • Ne mettez pas de chaînes entre guillemets, comme print(hello).

  • Ne mettez pas les clés du dictionnaire entre guillemets.

  • Utilisez les modules intégrés sans les importer au préalable.

  • Accédez aux variables de portée de l'extérieur. Par exemple, déclarez une variable dans une fonction et essayez d'y accéder de l'extérieur.

  • Accès à des variables ou des fonctions inexistantes #

  • Assurez-vous que nous n'accédons pas à des variables qui n'existent pas ou qui n'ont pas encore été définies.

  • Accès à des variables ou des fonctions inexistantes

  • Assurez-vous que nous n'accédons pas à des variables qui n'existent pas ou qui n'ont pas encore été définies.
  • # ⛔️ NameError: name 'do_math' is not defined
    print(do_math(15, 15))
    
    
    def do_math(a, b):
        return a + b

    L'exemple de code provoque l'erreur "NameError : la fonction n'est pas définie" car nous essayons d'appeler la fonction avant qu'elle ne soit déclarée.

  • Pour résoudre cette erreur, déplacez la ligne qui appelle la fonction ou accède à la variable après l'avoir déclarée.
# ✅ 1) 声明函数或变量
def do_math(a, b):
    return a + b

# ✅ 2) 之后访问它
print(do_math(15, 15))  # ????️ 30

Veuillez noter que nous devons également instancier la classe ou appeler une méthode de classe après la déclaration de la classe.

La même chose est vraie lors de l'utilisation de variables.

# ⛔️ NameError: name 'variable' is not defined.
print(variable)

variable = 'jiyik.com'

Assurez-vous de déplacer la ligne accédant à la variable sous la ligne la déclarant.

variable = 'jiyik.com'

print(variable)  # ????️ jiyik.com

Oublier de mettre une chaîne entre guillemets simples ou doubles

Une autre cause de l'erreur est d'oublier de mettre une chaîne entre guillemets simples ou doubles. La fonction

def greet(name):
    return 'Hello ' + name


# ⛔️ NameError: name 'Fql' is not defined. Did you mean: 'slice'?
greet(Fql) # ????️ 忘记用引号括起字符串

greet devrait être appelée avec une chaîne, mais nous avons oublié de mettre la chaîne entre guillemets, donc une erreur avec le nom 'X' non défini s'est produite.

Cela se produit également lors du passage d'une chaîne à la fonction print() sans entourer la chaîne entre guillemets.

Pour résoudre cette erreur, placez la chaîne entre guillemets.

def greet(name):
    return 'Hello ' + name

greet('Fql')
Utiliser un module intégré sans l'importer

Si nous utilisons un module intégré sans l'importer, cela provoquera également "
NameError : le nom n'est pas défini

". print() 函数而不用引号将字符串引起来时,也会发生这种情况。

要解决该错误,请将字符串括在引号中。

# ⛔️ NameError: name 'math' is not defined
print(math.floor(15.5))

使用内置模块而不导入它

如果我们使用内置模块而不导入它,也会导致“NameError: name is not defined”。

import math
print(math.floor(15.5))  # ????️ 15

我们使用 math 模块而不先导入它,所以 Python 不知道 math 指的是什么。

“NameError: name ‘math’ is not defined”意味着我们正在尝试访问 math 模块上的函数或属性,但在访问该属性之前我们还没有导入模块。

要解决该错误,请确保导入我们正在使用的所有模块。

employee = {
    'name': 'Jiyik',
    # ⛔️ NameError: name 'age' is not defined
    age: 30 # ????️ 字典键未包含在引号中
}

import math 行是必需的,因为它将 math 模块加载到我们的代码中。

模块只是函数和类的集合。

我们必须先加载模块,然后才能访问其成员。

忘记用引号将字典的键括起来

如果我们有一本字典而忘记将其键用引号括起来,也会导致该错误。

employee = {
    'name': 'Jiyik',
    'age': 30
}

除非字典中有数字键,否则请确保将它们用单引号或双引号引起来。

def get_message():
    message = 'jiyik.com' # ????️ 函数中声明的变量
    return message


get_message()

# ⛔️ NameError: name 'message' is not defined
print(message)

尝试从外部访问作用域变量

如果我们尝试从外部访问范围变量,也会发生该错误。

# ????️ 在外部范围内声明变量
message = 'hello world'

def get_message():
    return message


get_message()

print(message)  # ????️ "hello world"

message 变量是在 get_message 函数中声明的,因此无法从外部范围访问它。

如果必须从外部访问变量,最好的解决方法是在外部作用域中声明该变量。

def get_message():
    message = 'jiyik.com'
    return message


result = get_message()

print(result)  # ????️ "hello world"

在这种情况下,另一种方法是从函数返回值并将其存储在变量中。

def get_message():
    # ????️ 将 message 标记为全局
    global message

    # ????️ change its value
    message = 'hello world'

    return message


get_message()

print(message)  # ????️ "hello world"

另一种选择是将变量标记为全局变量。

def outer():
    def inner():
        message = 'jiyik.com'
        print(message)

    inner()

    # ⛔️ NameError: name 'message' is not defined
    print(message)


outer()

请注意 ,通常应避免使用 global 关键字,因为它会使我们的代码更难阅读和推理。

试图访问在嵌套函数中声明的变量

如果我们尝试从外部函数访问在嵌套函数中声明的变量,我们可以将该变量标记为非局部变量。

def outer():
    # ????️ 初始化 message 变量
    message = ''

    def inner():
        # ????️ 将 message 标记为 nonlocal
        nonlocal message
        message = 'jiyik.com'
        print(message)

    inner()

    print(message)  # ????️ "jiyik.com"


outer()

内部函数声明了一个名为 message 的变量,但我们尝试从外部函数访问该变量并得到“name message is not defined”错误。

为了解决这个问题,我们可以将消息变量标记为非局部变量。

def outer():
    # ????️ 初始化 message 变量
    message = ''

    def inner():
        # ????️ 在内部范围内声明 message
        message = 'hello world'
        print(message)

    inner()

    print(message)  # ????️ ""

outer()

nonlocal

# ⛔️ NameError: name 'Employee' is not defined
emp1 = Employee('jiyik', 100)


class Employee():
    def __init__(self, name, salary):
        self.name = name
        self.salary = salary

    def get_name(self):
        return self.name
🎜Nous utilisons le module mathématique sans l'importer au préalable, donc Python ne sait pas à quoi font référence les mathématiques. 🎜🎜 "NameError : le nom ‘math’ n'est pas défini" signifie que nous essayons d'accéder à une fonction ou une propriété sur le module mathématique, mais que nous n'avons pas importé le module avant d'accéder à la propriété. 🎜🎜Pour résoudre cette erreur, assurez-vous d'importer tous les modules que nous utilisons. La ligne 🎜
class Employee():
    def __init__(self, name, salary):
        self.name = name
        self.salary = salary

    def get_name(self):
        return self.name


emp1 = Employee('jiyik', 100)
print(emp1.name)  # ????️ jiyik
🎜import math est obligatoire car elle charge le module 🎜math🎜 dans notre code. 🎜🎜Un module n'est qu'un ensemble de fonctions et de classes. 🎜🎜Nous devons charger le module avant de pouvoir accéder à ses membres. 🎜🎜J'ai oublié de mettre les clés du dictionnaire entre guillemets 🎜🎜 Cette erreur peut également être provoquée si nous avons un dictionnaire et oublions de mettre ses clés entre guillemets. 🎜
try:
    # ????️ 此处的代码可能会引发错误

    import math
    result = math.floor(15.5)

except ImportError:
    math.floor(18.5)

print(math.floor(20.5))
🎜 À moins que vous n'ayez des touches numériques dans le dictionnaire, assurez-vous de les entourer de guillemets simples ou doubles. 🎜
# ✅ 将 import 语句移动到文件顶部
import math

try:
    result = math.floor(15.5)

except ImportError:
    math.floor(18.5)

print(math.floor(20.5))
🎜 Essayer d'accéder à la variable de portée de l'extérieur 🎜🎜 Cette erreur se produit également si nous essayons d'accéder à la variable de portée de l'extérieur. La variable 🎜rrreee🎜🎜message🎜 est déclarée dans la fonction get_message afin qu'elle ne soit pas accessible depuis l'extérieur de la portée. 🎜🎜Si une variable doit être accessible de l'extérieur, la meilleure solution est de déclarer la variable dans la portée externe. 🎜rrreee🎜Une alternative dans ce cas est de renvoyer la valeur de la fonction et de la stocker dans une variable. 🎜rrreee🎜Une autre option consiste à marquer la variable comme globale. 🎜rrreee🎜🎜🎜Veuillez noter🎜 que le mot-clé global doit généralement être évité car il rend notre code plus difficile à lire et à raisonner. 🎜🎜Essayer d'accéder à une variable déclarée dans une fonction imbriquée 🎜🎜Si nous essayons d'accéder à une variable déclarée dans une fonction imbriquée à partir d'une fonction externe, nous pouvons marquer la variable comme non locale. 🎜rrreee🎜La fonction interne déclare une variable nommée 🎜message🎜 mais nous essayons d'accéder à la variable à partir de la fonction externe et obtenons l'erreur "le nom du message n'est pas défini". 🎜🎜Pour résoudre ce problème, nous pouvons marquer les variables du message comme variables non locales. Le mot-clé 🎜rrreee🎜nonlocal nous permet d'utiliser des variables locales de la fonction englobante. 🎜

请注意 ,我们必须在外部函数中初始化消息变量,但我们能够在内部函数中更改它的值。

如果我们不使用 nonlocal 语句,对 print() 函数的调用将返回一个空字符串。

def outer():
    # ????️ 初始化 message 变量
    message = ''

    def inner():
        # ????️ 在内部范围内声明 message
        message = 'hello world'
        print(message)

    inner()

    print(message)  # ????️ ""

outer()

在类定义之前访问它

当我们在定义类之前访问类时,也会发生该错误。

# ⛔️ NameError: name 'Employee' is not defined
emp1 = Employee('jiyik', 100)


class Employee():
    def __init__(self, name, salary):
        self.name = name
        self.salary = salary

    def get_name(self):
        return self.name

要解决该错误,请将实例化行移至类声明下方。

class Employee():
    def __init__(self, name, salary):
        self.name = name
        self.salary = salary

    def get_name(self):
        return self.name


emp1 = Employee('jiyik', 100)
print(emp1.name)  # ????️ jiyik

如果我们正在使用来自第三方库的类,则必须先导入该类才能使用它。

请注意在 try/except 块中使用 import 语句

try/except 块中使用 import 语句时也可能发生该错误。

try:
    # ????️ 此处的代码可能会引发错误

    import math
    result = math.floor(15.5)

except ImportError:
    math.floor(18.5)

print(math.floor(20.5))

该代码示例有效,但是,如果 import 语句之前的某些代码引发错误,则该模块将不会被导入。

这是一个问题,因为我们正在 except 块中和 try/except 语句之外访问模块。

相反,将导入语句移至文件顶部。

# ✅ 将 import 语句移动到文件顶部
import math

try:
    result = math.floor(15.5)

except ImportError:
    math.floor(18.5)

print(math.floor(20.5))

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer