解讀Python變量的作用域

2021-01-07 米粒教育

變量作用域是指我們在程序中命名的變量在多大範圍能夠訪問到它。在函數內部聲明的變量,在函數外部是否能夠訪問?在模塊中聲明的變量,在函數內部是否能夠訪問?這些都是變量作用域要解決的問題。下面是一段有關變量作用域範圍的代碼。

上面的代碼是求圓的面積。在模塊頭部聲明了變量π,變量π被定義的area函數在內部使用,area函數求出圓的面積並輸出結果。print語句在這段代碼中使用了兩次:第一次是在area函數內部使用,輸入參數是在area函數內部聲明的變量s;第二次是在模塊中使用,輸入參數是在area函數內部聲明的變量s。下圖是上面代碼的執行結果。

從上圖執行結果可以看出。第一條print語句被正確執行,輸出了圓的面積。第二條print語句在執行過程中報錯,錯誤信息是「NameError: name 's' is not defined」,大體意思是「名稱錯誤:名稱『s』沒有被定義」。從給出的錯誤信息可以得出下面的結論:

在函數內部聲明的變量不能在函數外部訪問,函數內部聲明的變量為局部變量,其作用域僅限於函數內部。

有局部變量就有全局變量,上面代碼中的π就是全局變量。這裡的全局變量是指在模塊範圍內的全局變量,其作用域是整個模塊。全局變量可以在模塊內的函數內部使用,但需要遵循先聲明後使用的原則。

使用global關鍵字可以提升函數內部的局部變量為全局變量,當使用global關鍵字修飾變量時,該變量被提升為全局變量。

在上面的代碼中。函數area內部聲明的s使用了global關鍵字,局部變量s被提升為全局變量,因此在函數的外部也可以使用變量s。下圖是上面代碼的執行結果。

從執行結果可以看出。代碼中的第二條print語句被正確執行,輸出了圓的面積,其輸入的參數就是在area函數內部聲明的變量s。

在上面的探討中,我們了解了局部變量和全局變量的作用域,也知道了使用global關鍵字可以把函數內部的局部變量提升為全局變量。不過還有個問題沒有弄明白,當全局變量的名稱和函數體內局部變量的名稱相同時,哪個變量會被使用呢?

上面的代碼在area函數內部又聲明了一個變量π,這個變量π是局部變量,其精度要比全局變量π高。那麼問題來了,在程序執行過程中,計算圓的面積是用局部變量的π?還是用全局變量的π呢?下圖是上面代碼的執行結果。

執行結果給出了答案,當模塊內全局變量的名稱和函數體內局部變量的名稱相同時,在函數體內聲明的局部變量將覆蓋與其名稱相同的全局變量。

Python語言是支持函數嵌套的,即在函數體內部可以嵌套定義子函數。那麼嵌套的子函數是否可以在函數外部調用呢?它的作用域又是什麼範圍呢?

上面的代碼定義了foo函數,在foo函數內部又嵌套定義了bar子函數。Bar子函數使用了foo函數聲明的局部變量m,並輸出m與n的和。foo函數的最後一條語句調用了bar函數。需要記住,函數必須被調用後才執行函數體內代碼。

下圖是上面代碼的執行結果。

從執行結果可以看出。foo函數被正確執行,並輸出了正確的結果數字7。因此在嵌套函數中,子函數內部可以訪問在父函數聲明的變量。對子函數來說,父函數聲明的變量在整個函數體內就是全局變量。代碼中的最後一條語句是調用foo函數內部嵌套的子函數bar,在執行到這條語句時程序報錯,顯然在函數體內嵌套的函數是不能被外部調用的,其作用域僅限於函數體內部。

本文主要討論了全局變量和局部變量的作用域,也討論了嵌套函數的作用域,並了解了局部變量或嵌套函數僅限於在函數體內使用。如果要將局部變量或嵌套函數引入到全局環境中使用,這就需要用到閉包的概念了,閉包將放在後面介紹。

相關焦點

  • Python函數詳解一(函數參數、變量作用域)
    Python函數函數是python程序的重要組成部分。所謂函數就是實現某一特定功能的代碼段,可重複使用,提高了代碼的利用率。
  • 變量的作用域
    今日的內容是「VBA之EXCEL應用」的第五章「變量的類型及應用」中第三節「變量的作用域」。
  • Python變量作用域及global,nonlocal詳解
    作用域作用域就是作用範圍,python的作用域是靜態的,在代碼中變量名被賦值的位置決定了該變量能被訪問的範圍。
  • 解讀Python函數閉包的概念及作用域
    在前面的內容中,我們討論了全局變量和局部變量的作用域,也討論了嵌套函數的作用域,並了解了局部變量或嵌套函數僅限於在函數體內使用。但在一些情況下,可以將函數內部的嵌套函數引入到全局環境中使用,Python將引入到全局環境中使用的嵌套函數及其環境變量構建成一個封閉的包,該包內的環境變量不受外部環境的影響,這就是我們將要討論的閉包。前面我們了解了嵌套函數的作用域僅限於其父函數體內,如果在父函數體外調用其嵌套的函數,就會超出嵌套函數的作用域。
  • Python內置函數、作用域、閉包、遞歸
    9]# zip() #將對象逐一配對,按照短序列來生成li2 =[1,2,3]tu = ('a','b','c','e')list(zip(li2,tu)) # [(1, 'a'), (2, 'b'), (3, 'c')]dict(zip(li2,tu)) # {1: 'a', 2: 'b', 3: 'c'}2.函數內變量的作用域
  • python進階教程之變量
    參數返回 結果是一個 整數哈希 是一種 算法,其作用就是提取數據的 特徵碼(指紋)相同的內容 得到 相同的結果3.1 局部變量局部變量的作用```python def demo1():num = 10 print(num) num = 20 print("修改後 %d" % num)def demo2():num = 100 print(num)demo1() demo2()
  • JavaScript函數 - 作用域
    主要是因為所有的函數聲明都有一個作用域的概念 所謂作用域,就是起作用的範圍,或者說是有效範圍。我們每一個函數的聲明都會形成一個作用域。函數體內重新定義了一個var a=5; 所以在函數體內的alert輸出的結果就是5 3.執行第三個alert,由於sum(); 函數執行結束,已經輸出結果了,sum整個函數被銷毀,所以最後一個alert仍然是返回最上面定義的var a=10 第一個例子中 由於函數體內沒有var定義a,所以a是全局變量
  • 詳解python 局部變量與全局變量
    一旦本文將詳細分析python的全局變量與局部變量,學過php的人都知道,php裡面的全局變量是無法在function裡面去使用的,只有超全局變量才可以
  • Python 的 __name__ 變量,到底是個什麼東西?
    https://medium.freecodecamp.org/whats-in-a-python-s-name506262fe61e8大家應該已經在很多
  • Python 局部變量,全局變量,nonlocal 變量用法
    Python 局部變量,全局變量,非局部變量是 Python 三種常見的變量,它們與變量作用域息息相關
  • 從踩坑學 Python 內部原理(14):​消失的外部變量
    消失的外部變量e = 7try:    raise Exception()except Exception as e:    passOutput (Python 2.x):nothingOutput (Python 3.x):>>> print(e)NameError: name 'e' is not defined說明:出處: https://docs.python.org
  • Python專題 | (三)注釋、變量與輸出
    在編程前期,寫下變量、函數(之後會講到)和自己掌握不太清晰的語句的注釋就可以了。python注釋的寫法有很多種,我們分為兩種情況介紹:單行注釋一般使用「#」號開頭,表示注釋開始,#號之後的都是注釋,在這裡寫的所有語句均不會被計算機識別和執行。#號的作用範圍僅為當前行,想要將注釋寫到下一行時,可以在前面繼續添加#號。
  • python動態添加類對象成員:變量、函數
    pythonyu'yan那麼下面就以下圖中的代碼為例,為大家演示如何給python中的類對象動態的添加變量/屬性和方法:python示例類給類對象動態添加成員變量Python 支持為已創建好的對象動態增加實例變量而不會改變類的原始定義
  • Golang陷阱與缺陷:作用域
    今天準備的是《Golang陷阱與缺陷》系列的第一篇:作用域。這裡使用了短變量聲明符用於對 id 進行重新賦值,並聲明初始化 err 變量。邏輯上沒什麼毛病,但是代碼實現卻是有問題的。為了深刻理解這個問題,我們需要從作用域和短變量聲明符兩個方面進行說明。1.
  • Python中的global關鍵字的用法以及如何設置變量?
    我們使用global關鍵字可以定義Global的變量。global 關鍵字能什麼呢global關鍵字可以定義一個變量,被定義的變量可以在變量作用域之外被修改,通俗講就是一個全局的變量,這個全局的變量在其被定義後,可以在全部上文中修改和使用。
  • AngularJS的作用域
    作用域(scope)作用域(scope)是構成AngularJS應用的核心基礎,在整個框架中都被廣泛使用,因此了解它如何工作是非常重要的。應用的作用域是和應用的數據模型相關聯的,同時作用域也是表達式執行的上下文。
  • Python函數概述
    total # 調用sum函數total = sum( 10, 20 );print "Outside the function : ", total以上實例輸出結果:Inside the function :  30Outside the function :  30變量作用域
  • Linux下初學python之變量類型
    前言前面三篇文章我們和大家一起系統的學習了python的基本語法,包括:注釋、空行、列印、多行連字符等。今天我和大家一起學習python裡面的變量類型。python的變量類型1.變量的聲明和賦值在python中,變量是不需要聲明類型的。
  • 學習筆記:JS中的作用域和預解析
    ,而限定這個名字(變量)的可用性的代碼範圍就是這個名字的作用域,可用有效的減少變量名衝突 1、js的作用域(es6)之前:全局作用域,局部作用域 2、全局作用域:整個script標籤 或者是單獨的JS文件 3、局部作用域(函數作用域),在函數內部就是局部作用域,這個變量名只能在函數內部使用
  • Python函數中的全局變量與局部變量
    def first():    # 這個變量是函數內部定義的變量,屬於局部變量,只能在函數中使用    c = "Hello"    # 大括號{} 是format()函數的用法,格式化    print("c = {}".format(c))    # 如果局部變量定義的名稱與全局變量相同,相當於是在函數中又定義了一個新的局部變量