摘要:后來好奇自己寫了個小程序測驗同樣報了錯誤于是猜出了,在定義這個函數(shù)的時候,我們在函數(shù)內(nèi)存在給全局變量賦值的操作,它就默認(rèn)把函數(shù)內(nèi)的變成了本地變量。
上線前忙忙乎乎寫代碼,更新了一個同事的代碼,發(fā)現(xiàn)日志模塊報錯了
偽代碼如下:
from flask import current_app def add_log(data, app=None): if app: current_app = app current_app.game_logger.info(data) add_log(data)
錯誤代碼:
UnboundLocalError: local variable "current_app" referenced before assignment
因為確認(rèn)在flask的app上下文中,而且沒有傳app參數(shù)進去,所以光看代碼邏輯,一直很奇怪為啥會報current_app不存在的錯誤。
后來好奇自己寫了個小程序測驗
g = 10 def test(a=None): if a: g = a print g test()
同樣報了UnboundLocalError錯誤
local variable "g" referenced before assignment
于是猜出了,在定義這個函數(shù)的時候,我們在函數(shù)內(nèi)存在給全局變量 g 賦值的操作,它就默認(rèn)把函數(shù)內(nèi)的 g 變成了本地變量。(即便這條賦值語句并沒有被執(zhí)行)
所以解決方法是,就是很簡單的加個 global 申明全局變量
修改后的代碼
g = 10 def test(a=None): global g if a: g = a print g test()
輸出正常了- -
誒,說到底就是基礎(chǔ)不夠扎實啊╮(╯_╰)╭
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/37824.html
摘要:循環(huán)中當(dāng)為時,將對象返回并作為全局變量的內(nèi)容是字符串,接下來,報錯。幸運的是,代碼修改以后,執(zhí)行正常,我也找到了一些文章來解釋這個問題,我的第一感覺也沒有錯,的確是變量作用域的問題,代碼在執(zhí)行過程中,實際上是在訪問,而不是我們期望的。 使用python有些年頭了,自認(rèn)為對Python的基本知識很了解了,今天發(fā)生的一件事讓我對Python有了更多的認(rèn)識,寫成文章做個記錄。 同事讓我?guī)兔?..
摘要:作用域和閉包是最重要的概念之一,想要進一步學(xué)習(xí),就必須理解作用域和閉包的工作原理。全局和局部作用域的關(guān)系在函數(shù)體內(nèi),局部變量的優(yōu)先級高于同名的全局變量。作用域鏈的用途,是保證對執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問。 作用域和閉包是 JavaScript 最重要的概念之一,想要進一步學(xué)習(xí) JavaScript,就必須理解 JavaScript 作用域和閉包的工作原理。 作用域 任何...
摘要:讓我們拆開寫小明正常結(jié)果單獨調(diào)用函數(shù)怎么返回了請注意,我們已經(jīng)進入到了的一個大坑里。如果單獨調(diào)用函數(shù),比如,此時,該函數(shù)的指向全局對象,也就是。 函數(shù) 1. arguments JavaScript還有一個免費贈送的關(guān)鍵字arguments,它只在函數(shù)內(nèi)部起作用,并且永遠指向當(dāng)前函數(shù)的調(diào)用者傳入的所有參數(shù)。arguments類似Array但它不是一個Array: function fo...
摘要:內(nèi)存回收此時,局部變量就沒有存在的必要了,因此可以釋放它們的內(nèi)存以供將來使用。局部變量會在它們離開執(zhí)行環(huán)境時自動被解除引用,如下面這個例子所示手工解除的引用由于局部變量在函數(shù)執(zhí)行完畢后就離開了其執(zhí)行環(huán)境,因此無需我們顯式地去為它解除引用。 JavaScript 具有自動垃圾收集機制(GC:Garbage Collecation),也就是說,執(zhí)行環(huán)境會負(fù)責(zé)管理代碼執(zhí)行過程中使用的內(nèi)存。而...
摘要:在內(nèi)置命名空間不能使用全局和局部的名字??梢孕蜗蟮乩斫獬蓛?nèi)置命名空間具有最高級別,不需要定義就可以使用,全局命名空間次之,最低級是局部命名空間。 python中的命名空間分三種: 內(nèi)置的命名空間,在啟動解釋器的時候自動加載進內(nèi)存的各種名字所在的空間,比如print,input等不需要定義就可以使用的名字 全局命名空間,就是從上到下所有我們定義的變量名和函數(shù)名所在的空間,是在程序從上到下...
閱讀 3234·2021-09-28 09:43
閱讀 1058·2021-09-08 09:35
閱讀 1579·2019-08-30 15:56
閱讀 1322·2019-08-30 13:00
閱讀 2869·2019-08-29 18:35
閱讀 1975·2019-08-29 14:07
閱讀 3637·2019-08-29 13:13
閱讀 1478·2019-08-29 12:40