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