Maison > développement back-end > Tutoriel Python > 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

王林
Libérer: 2023-04-28 12:22:15
avant
1732 Les gens l'ont consulté

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) # ????️ 拼写错误的变量名
Copier après la connexion

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)
Copier après la connexion

«

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
    Copier après la connexion

    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
Copier après la connexion

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'
Copier après la connexion

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

variable = 'jiyik.com'

print(variable)  # ????️ jiyik.com
Copier après la connexion

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) # ????️ 忘记用引号括起字符串
Copier après la connexion

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')
Copier après la connexion
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))
Copier après la connexion

使用内置模块而不导入它

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

import math
print(math.floor(15.5))  # ????️ 15
Copier après la connexion

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

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

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

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

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

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

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

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

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

employee = {
    'name': 'Jiyik',
    'age': 30
}
Copier après la connexion

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

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


get_message()

# ⛔️ NameError: name 'message' is not defined
print(message)
Copier après la connexion

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

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

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

def get_message():
    return message


get_message()

print(message)  # ????️ "hello world"
Copier après la connexion

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

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

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


result = get_message()

print(result)  # ????️ "hello world"
Copier après la connexion

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

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

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

    return message


get_message()

print(message)  # ????️ "hello world"
Copier après la connexion

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

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

    inner()

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


outer()
Copier après la connexion

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

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

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

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

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

    inner()

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


outer()
Copier après la connexion

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

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

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

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

    inner()

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

outer()
Copier après la connexion
Copier après la connexion

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
Copier après la connexion
Copier après la connexion
🎜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
Copier après la connexion
Copier après la connexion
🎜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))
Copier après la connexion
Copier après la connexion
🎜 À 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))
Copier après la connexion
Copier après la connexion
🎜 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()
Copier après la connexion
Copier après la connexion

在类定义之前访问它

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

# ⛔️ 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
Copier après la connexion
Copier après la connexion

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

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
Copier après la connexion
Copier après la connexion

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

请注意在 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))
Copier après la connexion
Copier après la connexion

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

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

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

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

try:
    result = math.floor(15.5)

except ImportError:
    math.floor(18.5)

print(math.floor(20.5))
Copier après la connexion
Copier après la connexion

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!

Étiquettes associées:
source:yisu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal