簡體   English   中英

從settings.py導入的變量的UnboundLocalError

[英]UnboundLocalError for variable imported from settings.py

我有一個文件settings.py,其中定義了以下變量:

DEBUG_MODE = True
WRAP_UP = False

我正在使用以下命令將設置導入到腳本中:

from settings import *

我可以毫無問題地運行它:

if(DEBUG_MODE):
    # Do something

但是當我運行這個:

if(WRAP_UP == False):
    # Do something

它給了我以下錯誤:

UnboundLocalError: local variable 'WRAP_UP' referenced before assignment.

為什么一個變量起作用而另一個變量不起作用? 我該如何解決?

在Python中,在函數內部,如果您在函數中的任何位置分配了未明確聲明的global變量或非nonlocal變量(閉包)的變量,則將其視為局部變量;如果未分配給變量,則將其視為nonlocal變量(閉包的,全局變量或內置變量) 。

因此,假設您from settings import *全局from settings import * (如果不是,則問題更大……),這將創建名為DEBUG_MODEWRAP_UP全局變量,因此您可以執行以下操作:

def spam():
    if DEBUG_MODE:
        # Do something

……而且行得通。 但是,如果您這樣做:

def eggs():
    if WRAP_UP:
        # Do something
    WRAP_UP = True

……那是行不通的。 賦值意味着eggs具有一個名為WRAP_UP的局部變量,該局部變量隱藏了相同名稱的全局變量。 因此,第一行正在嘗試訪問該本地變量,該變量尚無值。

該解決方案是一個顯式的global語句,即使有賦值,它也會強制eggs使用全局變量:

def eggs():
    global WRAP_UP
    if WRAP_UP:
        # Do something
    WRAP_UP = True

當然,這是假設您希望 eggs重新分配全局對象,但是我懷疑那是您想要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM