變量作用域

  • 一個(gè)變量的作用域或者其所屬的命名空間由該變量第一次被賦值的位置決定

  • Python中全局作用域就是模塊作用域,不存在一個(gè)變量可以直接跨好幾個(gè)模塊被調(diào)用的情況,我們要想訪問一個(gè)模塊中的變量,必須先import該模塊,通過該模塊訪問,所以在Python中說到全局,就等同于模塊

  • Python中的命名空間可以細(xì)分為四類:
    1.非本地命名空間,當(dāng)在一個(gè)函數(shù)內(nèi)部又定義了一個(gè)函數(shù),則外圍的函數(shù)的命名空間相對于內(nèi)部的函數(shù)來說就是非本地命名空間,內(nèi)部的函數(shù)的命名空間是本地命名空間。因?yàn)橥鈬瘮?shù)的命名空間相對于內(nèi)部函數(shù)來說不是全局命名空間,所以我們稱它為非本地命名空間
    2.本地命名空間,一般情況下使用def定義的函數(shù),其中的變量處于本地命名空間
    3.全局命名空間,也就是在模塊頂層定義的變量位于全局命名空間
    4.內(nèi)置命名空間,Python內(nèi)置的變量和方法都位于該命名空間

  • 還有一個(gè)知識(shí)點(diǎn)需要注意的是,我們在shell中使用python打開的交互式對話窗口,包括我們在這個(gè)窗口中定義的變量,函數(shù)等,也都位于一個(gè)全局命名空間,也就是位于一個(gè)模塊中,這個(gè)模塊的名字叫做__main__,所以我們經(jīng)常在代碼中看到if __name__ == __main__

  • 在一個(gè)函數(shù)內(nèi)部進(jìn)行變量查找的遵循LEGB規(guī)則,

    1. 就是先查找Local也就是本地命名空間
      2.如果沒有找到,再去非本地命名空間查找,也就是該函數(shù)的外圍函數(shù)去查找
      3.如果還沒有找到,就是全局命名空間找,也就是模塊內(nèi)查找
      4.如果還沒有找到,就去內(nèi)置命名空間內(nèi)查找
      5.經(jīng)過以上四步還沒有找到的話,就報(bào)錯(cuò)了
  • Python的四個(gè)命名空間查找規(guī)則可以用如下圖來展示


    捕獲.PNG
  • 舉個(gè)例子

x = 123
def fun():
  x="abc"#這個(gè)改動(dòng)不會(huì)影響到全局的x
def fun1():
  global x
  x="abc"#這個(gè)改動(dòng)會(huì)影響到全局的x
  • global和nonlocal語句是Python中唯一兩個(gè)看起來像是聲明的語句。由于變量可以直接被賦值并使用,所以我們都不會(huì)聲明一個(gè)變量,但是global可以聲明一個(gè)變量,聲明該變量為全局作用域,如下:
x=123
def fun():
  print x#可以直接使用全局作用域的變量
def fun1():
  x=456#定義一個(gè)本地變量,和全局變量不干擾
def fun2():
  global x#聲明x為全局變量
  x = 456#對x的重新賦值會(huì)影響到全局的x
  • 除了在函數(shù)中聲明global語句之外,還有其他的一些方法可以訪問全局變量,如下
x = 123
def fun():
  import test
  test.x = 456
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1、引言 最近在刷leetcode題的時(shí)候,遇到一個(gè)求最長回文子串的題目,于是,我寫了如下的代碼: 哎呀,寫了兩個(gè)...
    文哥的學(xué)習(xí)日記閱讀 14,522評論 6 32
  • python的域規(guī)則 -變量作用域:在Python程序中創(chuàng)建、改變、查找變量名時(shí),都是在一個(gè)保存變量名的空間中進(jìn)行...
    Gaterny閱讀 636評論 0 0
  • 好好學(xué)習(xí),天天向上 今天是:2017.05.20 昨天看了命名空間,但是還是分不清命名空間、作用域之間的關(guān)系。核心...
    Wakingup88688閱讀 1,423評論 0 1
  • 本章內(nèi)容 理解基本類型和引用類型的值 理解執(zhí)行環(huán)境 理解垃圾收集 由于不存在定義某個(gè)變量必須要保存何種數(shù)據(jù)類型值的...
    悶油瓶小張閱讀 368評論 0 0
  • 假如,你經(jīng)過縝密的財(cái)務(wù)分析實(shí)地調(diào)研,再經(jīng)過精準(zhǔn)的技術(shù)分析預(yù)測,你終于選定了某家上市公司的個(gè)股,預(yù)期漲幅非??捎^。于...
    F10學(xué)堂閱讀 265評論 0 0

友情鏈接更多精彩內(nèi)容