首頁  >  文章  >  後端開發  >  Python錯誤NameError:name 'X' is not defined如何解決

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

王林
王林轉載
2023-04-28 12:22:151644瀏覽

Python「NameError: name is not defined」發生在我們試圖存取一個未定義的變數或函數時,或在它被定義之前。

要解決該錯誤,需要確保我們沒有拼錯變數名稱並在宣告後存取它。

確保你沒有拼錯變數或函數

下面是產生上述錯誤的範例程式碼。

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

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

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

問題是我們拼錯了變數名稱。請注意,變數、函數和類別的名稱區分大小寫。

要解決這種情況下的錯誤,我們必須正確拼寫變數名稱。

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

print(employee)

‘X’ is not defined 錯誤的常見原因

出現Python“NameError: name is not defined”的原因有很多:

  • 存取不存在的變數。

  • 在宣告之前存取變數、函數或類別。

  • 變數、函數或類別的名稱拼字錯誤(名稱區分大小寫)。

  • 不要將字串用引號引起來,例如 print(hello)。

  • 不將字典的鍵用引號引起來。

  • 使用內建模組而不先導入它們。

  • 從外部存取作用域變數。例如,在函數中聲明一個變數並試圖從外部存取它。

  • 存取不存在的變數或函數

  • ##確保我們沒有存取不存在或尚未定義的變數。

存取不存在的變數或函數

確保我們沒有存取不存在或尚未定義的變數。

# ⛔️ NameError: name 'do_math' is not defined
print(do_math(15, 15))


def do_math(a, b):
    return a + b

程式碼範例導致「NameError: function is not defined」錯誤,因為我們試圖在函數宣告之前呼叫它。

要解決該錯誤,請在宣告變數後移動呼叫函數或存取變數的行。

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

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

請注意,我們也必須在類別宣告後實例化類別或呼叫類別方法。

使用變數時也是如此。

# ⛔️ 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 函數期望用字串調用,但我們忘記將字串用引號引起來,因此發生了名稱「X」未定義的錯誤。

當字串傳遞給 print() 函數而不用引號將字串引起來時,也會發生這種情況。

要解決該錯誤,請將字串括在引號中。

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

greet('Fql')

使用內建模組而不導入它

如果我們使用內建模組而不導入它,也會導致「NameError: name is not defined」。

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

我們使用 math 模組而不先導入它,所以 Python 不知道 math 指的是什麼。

「NameError: name ‘math’ is not defined」表示我們正在嘗試存取 math 模組上的函數或屬性,但在存取該屬性之前我們還沒有導入模組。

要解決該錯誤,請確保導入我們正在使用的所有模組。

import math
print(math.floor(15.5))  # ????️ 15

import math 行是必要的,因為它將 math 模組載入到我們的程式碼中。

模組只是函數和類別的集合。

我們必須先載入模組,然後才能存取其成員。

忘記用引號將字典的鍵括起來

如果我們有一本字典而忘記將其鍵用引號括起來,也會導致該錯誤。

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

除非字典中有數字鍵,否則請確保將它們用單引號或雙引號引起來。

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

嘗試從外部存取作用域變數

如果我們嘗試從外部存取範圍變量,也會發生該錯誤。

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


get_message()

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

message 變數是在 get_message 函數中聲明的,因此無法從外部範圍存取它。

如果必須從外部存取變量,最好的解決方法是在外部作用域中聲明該變數。

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

def get_message():
    return message


get_message()

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

在這種情況下,另一種方法是從函數傳回值並將其儲存在變數中。

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"

請注意 ,通常應避免使用global 關鍵字,因為它會使我們的程式碼更難閱讀和推理。

試圖存取在巢狀函數中宣告的變數

如果我們嘗試從外部函數存取在巢狀函數中宣告的變數,我們可以將該變數標記為非局部變數。

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

    inner()

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


outer()

內部函數宣告了一個名為 message 的變量,但我們嘗試從外部函數存取該變數並得到「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 關鍵字允許我們使用封閉函數的局部變數。

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

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

以上是Python錯誤NameError:name 'X' is not defined如何解決的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除