Python變數引用錯誤

2021-10-07 17:41:32 字數 1305 閱讀 7918

python unboundlocalerror: local variable '***' referenced before assignment

大意就是在變數定義前就引用了變數。

錯誤**如下:

def f():

print(n)

n = 10

f()

這裡還是很清楚,很明白。

然而下面的**就令人有些頭疼:

n = 100

def f():

print(n)

n = 10

f()

雖然定義了變數n,然後在函式內部修改,但是還是報相同的錯誤。原因在於在函式內部對變數n進行修改後,變數n被python直譯器理解為區域性變數,就變成和上面**一樣的情況了。

def f():

print(n)

f()

此時由於沒有定義變數n,所以報nameerror: name 『n』 is not defined

注意:一般情況下,在訪問變數時,會先查詢本地變數,然後是包裹此函式的外部函式內的變數,之後是全域性變數,最後是內建作用域的變數,即:l->e->g->b(e不一定存在)。在預設情況下,變數名賦值會在當前作用域建立變數和修改變數。

作用域     英文解釋     英文簡寫

區域性作用域(函式內)     local(function)     l

外部巢狀函式作用域     enclosing function locals     e

函式定義所在模組作用域     global(module)     g

python內建模組的作用域     bui     b

示例如下:

v = 100 # 全域性作用域

def fun1():

v = 200 # 外部巢狀函式作用域

print('fun1.v=', v)

print(locals())

def fun2():

v = 300 # 區域性作用域

print('fun2.v=', v)

print(max) # max函式都沒有建立,在內建函式作用域中,唯讀,不能改變 # 可以在其餘三個作用域重新建立。

print(locals())

fun2()

fun1()

print("全域性變數.v=", v)

print(max) # max變數定義在內建模組的作用域,是解釋執行器提前定義好的

print(locals())

未定義的引用錯誤

在編譯工程時出現 librestapi.a rest harbor.o 在函式 rest harbor get sysinfo 中 rest harbor.c 145 對 harbor get sysinfo 未定義的引用 collect2 error ld returned 1 exit stat...

發布後500訪問錯誤 dll引用錯誤

system.net.http相關dll 測試站點上的問題,本地沒出現這個問題 後來經提醒,試了一下將sina所需要的dll都放進去,就成功了。大概是因為引用sina的dll,其所需要的dll並沒有生成,發不上去後,bin檔案下的dll缺失 上方的解法,第一步是成功了,但是進入到第二步的時候,仍舊出...

解決myql 表和表迴圈引用錯誤

const document this.sequelize.define document const version this.sequelize.define version document.hasmany version 這將 document id 新增到版本 document.belon...