Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimana untuk menyelesaikan ralat Python NameError:name 'X' tidak ditakrifkan
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.
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) # ????️ 拼写错误的变量名
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.
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
# ✅ 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 fungsitanpa mengelilingi rentetan dalam petikan.
Untuk menyelesaikan ralat ini, sertakan rentetan dalam petikan.NameError: nama tidak ditakrifkandef greet(name): return 'Hello ' + name greet('Fql')Menggunakan modul terbina dalam tanpa mengimportnya
Jika kita menggunakan modul terbina dalam tanpa mengimportnya, ia juga akan menyebabkan "print()
".
# ⛔️ 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. Barisdiperlukan kerana ia memuatkan modulimport math print(math.floor(15.5)) # ????️ 15
matematik
ke dalam kod kami. Modul hanyalah koleksi fungsi dan kelas.import math
Kita 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 }
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
# ????️ 在外部范围内声明变量 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_message
Pilihan 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.mesejCuba 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. Fungsiglobal
def outer(): def inner(): message = 'jiyik.com' print(message) inner() # ⛔️ NameError: name 'message' is not defined print(message) outer()dalam mengisytiharkan pembolehubah bernama
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: # ????️ 此处的代码可能会引发错误 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!