Python錯誤NameError:name?'X'?is?not?defined的解決方法
Python“NameError: name is not defined”發(fā)生在我們試圖訪問一個未定義的變量或函數(shù)時,或者在它被定義之前。
要解決該錯誤,需要確保我們沒有拼錯變量名并在聲明后訪問它。
確保你沒有拼錯變量或函數(shù)
下面是產(chǎn)生上述錯誤的示例代碼。
employee = { 'name': 'Jiyik', 'age': 30, } # ?? NameError: name 'Employee' is not defined. Did you mean: 'employee'? print(Employee) # ??? 拼寫錯誤的變量名
問題是我們拼錯了變量名。 請注意,變量、函數(shù)和類的名稱區(qū)分大小寫。
要解決這種情況下的錯誤,我們必須正確拼寫變量名。
employee = { 'name': 'Jiyik', 'age': 30, } print(employee)
‘X’ is not defined 錯誤的常見原因
出現(xiàn) Python“NameError: name is not defined”的原因有多種:
- 訪問不存在的變量。
- 在聲明之前訪問變量、函數(shù)或類。
- 變量、函數(shù)或類的名稱拼寫錯誤(名稱區(qū)分大小寫)。
- 不要將字符串用引號引起來,例如 print(hello)。
- 不將字典的鍵用引號引起來。
- 使用內(nèi)置模塊而不先導(dǎo)入它們。
- 從外部訪問作用域變量。 例如,在函數(shù)中聲明一個變量并試圖從外部訪問它。
- 訪問不存在的變量或函數(shù)#
- 確保我們沒有訪問不存在或尚未定義的變量。
訪問不存在的變量或函數(shù)
確保我們沒有訪問不存在或尚未定義的變量。
# ?? NameError: name 'do_math' is not defined print(do_math(15, 15)) def do_math(a, b): return a + b
代碼示例導(dǎo)致“NameError: function is not defined”錯誤,因為我們試圖在函數(shù)聲明之前調(diào)用它。
要解決該錯誤,請在聲明變量后移動調(diào)用函數(shù)或訪問變量的行。
# ? 1) 聲明函數(shù)或變量 def do_math(a, b): return a + b # ? 2) 之后訪問它 print(do_math(15, 15)) # ??? 30
請注意,我們還必須在類聲明后實例化類或調(diào)用類方法。
使用變量時也是如此。
# ?? NameError: name 'variable' is not defined. print(variable) variable = 'jiyik.com'
確保將訪問變量的行移到聲明它的行下方。
variable = 'jiyik.com' print(variable) # ??? jiyik.com
忘記用單引號或雙引號將字符串括起來
錯誤的另一個原因是忘記將字符串用單引號或雙引號引起來。
def greet(name): return 'Hello ' + name # ?? NameError: name 'Fql' is not defined. Did you mean: 'slice'? greet(Fql) # ??? 忘記用引號括起字符串
greet 函數(shù)期望用字符串調(diào)用,但我們忘記將字符串用引號引起來,因此發(fā)生了名稱“X”未定義的錯誤。
當將字符串傳遞給
print()
函數(shù)而不用引號將字符串引起來時,也會發(fā)生這種情況。
要解決該錯誤,請將字符串括在引號中。
def greet(name): return 'Hello ' + name greet('Fql')
使用內(nèi)置模塊而不導(dǎo)入它
如果我們使用內(nèi)置模塊而不導(dǎo)入它,也會導(dǎo)致“NameError: name is not defined”。
# ?? NameError: name 'math' is not defined print(math.floor(15.5))
我們使用 math 模塊而不先導(dǎo)入它,所以 Python 不知道 math 指的是什么。
“NameError: name ‘math’ is not defined”意味著我們正在嘗試訪問 math 模塊上的函數(shù)或?qū)傩?,但在訪問該屬性之前我們還沒有導(dǎo)入模塊。
要解決該錯誤,請確保導(dǎo)入我們正在使用的所有模塊。
import math print(math.floor(15.5)) # ??? 15
import math
行是必需的,因為它將 math 模塊加載到我們的代碼中。
模塊只是函數(shù)和類的集合。
我們必須先加載模塊,然后才能訪問其成員。
忘記用引號將字典的鍵括起來
如果我們有一本字典而忘記將其鍵用引號括起來,也會導(dǎo)致該錯誤。
employee = { 'name': 'Jiyik', # ?? NameError: name 'age' is not defined age: 30 # ??? 字典鍵未包含在引號中 }
除非字典中有數(shù)字鍵,否則請確保將它們用單引號或雙引號引起來。
employee = { 'name': 'Jiyik', 'age': 30 }
嘗試從外部訪問作用域變量
如果我們嘗試從外部訪問范圍變量,也會發(fā)生該錯誤。
def get_message(): message = 'jiyik.com' # ??? 函數(shù)中聲明的變量 return message get_message() # ?? NameError: name 'message' is not defined print(message)
message 變量是在 get_message
函數(shù)中聲明的,因此無法從外部范圍訪問它。
如果必須從外部訪問變量,最好的解決方法是在外部作用域中聲明該變量。
# ??? 在外部范圍內(nèi)聲明變量 message = 'hello world' def get_message(): return message get_message() print(message) # ??? "hello world"
在這種情況下,另一種方法是從函數(shù)返回值并將其存儲在變量中。
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"
請注意
,通常應(yīng)避免使用global
關(guān)鍵字,因為它會使我們的代碼更難閱讀和推理。
試圖訪問在嵌套函數(shù)中聲明的變量
如果我們嘗試從外部函數(shù)訪問在嵌套函數(shù)中聲明的變量,我們可以將該變量標記為非局部變量。
def outer(): def inner(): message = 'jiyik.com' print(message) inner() # ?? NameError: name 'message' is not defined print(message) outer()
內(nèi)部函數(shù)聲明了一個名為 message 的變量,但我們嘗試從外部函數(shù)訪問該變量并得到“name message is not defined”錯誤。
為了解決這個問題,我們可以將消息變量標記為非局部變量。
def outer(): # ??? 初始化 message 變量 message = '' def inner(): # ??? 將 message 標記為 nonlocal nonlocal message message = 'jiyik.com' print(message) inner() print(message) # ??? "jiyik.com" outer()
nonlocal
關(guān)鍵字允許我們使用封閉函數(shù)的局部變量。
請注意
,我們必須在外部函數(shù)中初始化消息變量,但我們能夠在內(nèi)部函數(shù)中更改它的值。
如果我們不使用 nonlocal
語句,對 print()
函數(shù)的調(diào)用將返回一個空字符串。
def outer(): # ??? 初始化 message 變量 message = '' def inner(): # ??? 在內(nèi)部范圍內(nèi)聲明 message message = 'hello world' print(message) inner() print(message) # ??? "" outer()
在類定義之前訪問它
當我們在定義類之前訪問類時,也會發(fā)生該錯誤。
# ?? 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
如果我們正在使用來自第三方庫的類,則必須先導(dǎo)入該類才能使用它。
請注意在 try/except 塊中使用 import 語句
在 try/except
塊中使用 import
語句時也可能發(fā)生該錯誤。
try: # ??? 此處的代碼可能會引發(fā)錯誤 import math result = math.floor(15.5) except ImportError: math.floor(18.5) print(math.floor(20.5))
該代碼示例有效,但是,如果 import
語句之前的某些代碼引發(fā)錯誤,則該模塊將不會被導(dǎo)入。
這是一個問題,因為我們正在 except 塊中和 try/except
語句之外訪問模塊。
相反,將導(dǎo)入語句移至文件頂部。
# ? 將 import 語句移動到文件頂部 import math try: result = math.floor(15.5) except ImportError: math.floor(18.5) print(math.floor(20.5))
總結(jié)
要解決 Python “NameError: name is not defined”,請確保:
- 我們沒有訪問不存在的變量。
- 我們不會在聲明變量、函數(shù)或類之前訪問它。
- 我們沒有拼錯變量、函數(shù)或類的名稱(名稱區(qū)分大小寫)。
- 我們沒有忘記用引號括起一個字符串,例如 print(hello)。
- 我們沒有忘記用引號將字典的鍵括起來。
- 如果不先導(dǎo)入內(nèi)置模塊,就不會使用它們。
- 我們不是從外部訪問作用域變量。 例如,在函數(shù)中聲明一個變量并試圖從外部訪問它。
到此這篇關(guān)于Python錯誤NameError:name ‘X‘ is not defined的解決方法的文章就介紹到這了,更多相關(guān)Python錯誤NameError:name ‘X‘ is not defined內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python報錯:NameError:?name?‘xxx‘?is?not?defined的解決辦法
- Python報錯NameError: name ‘secrets‘ is not defined解決
- Python中NameError: name ‘Image‘ is not defined的問題解決
- Python已解決NameError: name ‘xxx‘ is not defined
- 如何徹底解決python?NameError:name?'__file__'?is?not?defined
- Python UnboundLocalError和NameError錯誤根源案例解析
- 解決NameError:name'pip'is not defined使用pip時報錯問題
相關(guān)文章
Kmeans聚類算法python sklearn用戶畫像教程
這篇文章主要介紹了Kmeans聚類算法python sklearn用戶畫像教程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07python sort、sorted高級排序技巧分享(key的使用)
這篇文章主要介紹了python sort、sorted高級排序技巧(key的使用),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03python sys,os,time模塊的使用(包括時間格式的各種轉(zhuǎn)換)
這篇文章主要介紹了python sys,os,time模塊的使用(包括時間格式的各種轉(zhuǎn)換),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-04-04Python中urllib與urllib2模塊的變化與使用詳解
urllib是python提供的一個用于操作URL的模塊,在python2.x中有URllib庫,也有Urllib2庫,在python3.x中Urllib2合并到了Urllib中,我們爬取網(wǎng)頁的時候需要經(jīng)常使用到這個庫,需要的朋友可以參考下2023-05-05