成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【大坑記】Python中的全局變量變成了局部變量

DobbyKim / 901人閱讀

摘要:后來(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

相關(guān)文章

  • Python變量命名與作用域的坑

    摘要:循環(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ī)兔?..

    amuqiao 評(píng)論0 收藏0
  • 《JavaScript 闖關(guān)》之作用域和閉包

    摘要:作用域和閉包是最重要的概念之一,想要進(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 作用域和閉包的工作原理。 作用域 任何...

    Jacendfeng 評(píng)論0 收藏0
  • js溫故而知新2——學(xué)習(xí)廖雪峰的js教程

    摘要:讓我們拆開(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...

    Caizhenhao 評(píng)論0 收藏0
  • 《JavaScript 闖關(guān)》之垃圾回收和內(nèi)存管理

    摘要:內(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)存。而...

    Sleepy 評(píng)論0 收藏0
  • python基礎(chǔ)知識(shí)之函數(shù)初階——命名空間

    摘要:在內(nèi)置命名空間不能使用全局和局部的名字??梢孕蜗蟮乩斫獬蓛?nèi)置命名空間具有最高級(jí)別,不需要定義就可以使用,全局命名空間次之,最低級(jí)是局部命名空間。 python中的命名空間分三種: 內(nèi)置的命名空間,在啟動(dòng)解釋器的時(shí)候自動(dòng)加載進(jìn)內(nèi)存的各種名字所在的空間,比如print,input等不需要定義就可以使用的名字 全局命名空間,就是從上到下所有我們定義的變量名和函數(shù)名所在的空間,是在程序從上到下...

    dack 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<