Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimana untuk menyelesaikan ralat Python NameError:name 'X' tidak ditakrifkan

Bagaimana untuk menyelesaikan ralat Python NameError:name 'X' tidak ditakrifkan

王林
王林ke hadapan
2023-04-28 12:22:151727semak imbas

Python "NameError: nama tidak ditakrifkan" berlaku apabila kita cuba mengakses pembolehubah atau fungsi yang tidak ditentukan, atau sebelum ia ditakrifkan.

Untuk membetulkan ralat ini, kami perlu memastikan kami tidak tersilap mengeja nama pembolehubah dan mengaksesnya selepas mengisytiharkannya.

Pastikan anda tidak tersilap mengeja pembolehubah atau fungsi

Berikut ialah contoh kod yang menghasilkan ralat di atas.

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

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

Bagaimana untuk menyelesaikan ralat Python NameError:name X tidak ditakrifkan

Masalahnya ialah kami salah mengeja nama pembolehubah. Ambil perhatian bahawa pembolehubah, fungsi dan nama kelas adalah sensitif huruf besar-besaran.

Untuk menyelesaikan ralat dalam kes ini, kita mesti mengeja nama pembolehubah dengan betul.

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

print(employee)

‘ 🎜>

Akses pembolehubah yang tidak wujud.

    Akses pembolehubah, fungsi atau kelas sebelum mengisytiharkannya.
  • Nama pembolehubah, fungsi atau kelas tersilap ejaan (nama adalah sensitif huruf besar-besaran).
  • Jangan sertakan rentetan dalam petikan, seperti cetak(hello).
  • Jangan sertakan kunci kamus dalam petikan.
  • Gunakan modul terbina dalam tanpa mengimportnya terlebih dahulu.
  • Akses pembolehubah skop dari luar. Sebagai contoh, mengisytiharkan pembolehubah dalam fungsi dan cuba mengaksesnya dari luar.
  • Mengakses pembolehubah atau fungsi yang tidak wujud #
  • Pastikan kami tidak mengakses pembolehubah yang tidak wujud atau tidak ditentukan.
  • Mengakses pembolehubah atau fungsi yang tidak wujud
  • Pastikan kami tidak mengakses pembolehubah yang tidak wujud atau tidak ditentukan.

    # ⛔️ NameError: name 'do_math' is not defined
    print(do_math(15, 15))
    
    
    def do_math(a, b):
        return a + b
  • Contoh kod menghasilkan ralat "NameError: fungsi tidak ditakrifkan" kerana kami cuba memanggil fungsi sebelum ia diisytiharkan.

Untuk menyelesaikan ralat ini, gerakkan baris yang memanggil fungsi atau mengakses pembolehubah selepas mengisytiharkannya.

# ✅ 1) 声明函数或变量
def do_math(a, b):
    return a + b

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

Sila ambil perhatian bahawa kami juga mesti membuat instantiate kelas atau memanggil kaedah kelas selepas pengisytiharan kelas.

Begitu juga apabila menggunakan pembolehubah.

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

variable = 'jiyik.com'

Pastikan untuk mengalihkan baris yang mengakses pembolehubah di bawah baris yang mengisytiharkannya.

variable = 'jiyik.com'

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

Terlupa untuk mengelilingi rentetan dalam petikan tunggal atau berganda

Satu lagi punca ralat ialah terlupa untuk mengelilingi rentetan dalam petikan tunggal atau berganda. Fungsi

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


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

menyambut akan dipanggil dengan rentetan, tetapi kami terlupa untuk meletakkan rentetan dalam petikan, jadi ralat dengan nama 'X' tidak ditentukan berlaku.

Ini juga berlaku apabila menghantar rentetan ke fungsi

tanpa mengelilingi rentetan dalam petikan.

Untuk menyelesaikan ralat ini, sertakan rentetan dalam petikan.
def greet(name):
    return 'Hello ' + name

greet('Fql')

Menggunakan modul terbina dalam tanpa mengimportnyaprint()

Jika kita menggunakan modul terbina dalam tanpa mengimportnya, ia juga akan menyebabkan "
NameError: nama tidak ditakrifkan

".

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

Kami menggunakan modul matematik tanpa mengimportnya terlebih dahulu, jadi Python tidak tahu apa yang dimaksudkan dengan matematik.

"NameError: nama ‘math’ tidak ditakrifkan" bermakna kami cuba mengakses fungsi atau sifat pada modul matematik, tetapi kami belum mengimport modul sebelum mengakses harta itu.

Untuk menyelesaikan ralat ini, pastikan anda mengimport semua modul yang kami gunakan. Baris

import math
print(math.floor(15.5))  # ????️ 15
diperlukan kerana ia memuatkan modul

matematik

ke dalam kod kami.

Modul hanyalah koleksi fungsi dan kelas.

import mathKita mesti memuatkan modul sebelum kita boleh mengakses ahlinya. Terlupa untuk menyertakan kunci kamus dalam petikan

Ralat ini juga boleh disebabkan jika kita mempunyai kamus dan terlupa untuk menyertakan kuncinya dalam petikan.

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

Melainkan anda mempunyai kunci angka dalam kamus, pastikan anda mengelilinginya dalam petikan tunggal atau berganda.

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

Cuba mengakses pembolehubah skop dari luar

Ralat ini juga berlaku jika kita cuba mengakses pembolehubah skop dari luar. Pembolehubah

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


get_message()

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

mesej

diisytiharkan di dalam fungsi

, jadi ia tidak boleh diakses dari skop luar.

Jika pembolehubah mesti diakses dari luar, penyelesaian terbaik ialah mengisytiharkan pembolehubah dalam skop luar.

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

def get_message():
    return message


get_message()

print(message)  # ????️ "hello world"
Alternatif dalam kes ini ialah mengembalikan nilai daripada fungsi dan menyimpannya dalam pembolehubah.
def get_message():
    message = 'jiyik.com'
    return message


result = get_message()

print(result)  # ????️ "hello world"
get_messagePilihan lain ialah menandakan pembolehubah sebagai global.
def get_message():
    # ????️ 将 message 标记为全局
    global message

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

    return message


get_message()

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

, kata kunci

biasanya harus dielakkan kerana ia menjadikan kod kami lebih sukar untuk dibaca dan difikirkan.

Cuba mengakses pembolehubah yang diisytiharkan dalam fungsi bersarang 请注意 Jika kita cuba mengakses pembolehubah yang diisytiharkan dalam fungsi bersarang daripada fungsi luar, kita boleh menandakan pembolehubah itu sebagai bukan- pembolehubah tempatan. Fungsi global

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

    inner()

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


outer()
dalam mengisytiharkan pembolehubah bernama
mesej

tetapi kami cuba mengakses pembolehubah dari fungsi luar dan mendapatkan ralat "mesej nama tidak ditakrifkan".

Untuk menyelesaikan masalah ini, kita boleh menandakan pembolehubah mesej sebagai pembolehubah bukan tempatan. Kata kunci

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

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

    inner()

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


outer()

membolehkan kami menggunakan pembolehubah tempatan bagi fungsi yang disertakan.

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

如果我们不使用 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))

Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan ralat Python NameError:name 'X' tidak ditakrifkan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam