溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python錯誤NameError:name?'X'?is?not?defined如何解決

發(fā)布時間:2023-03-31 15:19:21 來源:億速云 閱讀:141 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容介紹了“Python錯誤NameError:name 'X' is not defined如何解決”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

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) # ????? 拼寫錯誤的變量名

Python錯誤NameError:name?'X'?is?not?defined如何解決

問題是我們拼錯了變量名。 請注意,變量、函數(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))

“Python錯誤NameError:name 'X' is not defined如何解決”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI