Python函數中的作用域規則詳解

 更新時間:2022年03月10日 14:43:17   作者:一只懐壞旭  
這篇文章主要為大家詳細介紹了Python的作用域規則,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

Python是靜態作用域語言,但是它自身是一個動態語言。在Python中變量的作用域是由變量在代碼中的位置決定的,與C語言有些相似,但不是完全一樣。

在Python 2.0及之前的版本中,Python只支持3種作用域,即局部作用域,全局作用域,內置作用域;在Python
2.2中,Python正式引入了一種新的作用域 — 嵌套作用域;嵌套作用域的引入,本質上為Python實現了對閉包的支持。

1、簡單介紹一下閉包

def test():
  A = 3
  B = 4
  def stu():
  	C = 3
  	return A+B+C
  return stu
stu = test()
stu

在上述此代碼中stu方法定義在test的內部,內部函數stu即可以使用外部函數test的變量,我們稱這種行為叫做閉包。

2、在Python中,并不是任何代碼塊都能引入新的作用域

Python中不是任何代碼塊都可以引入新的作用域這與C有很大的不同:

在C中:

#include<stdio.h>
int main() {    
if(2 > 0) {        
	int i = 0;
   	 }
    printf("i = %d", i);    
    return 0;
}

在上述代碼中,if子句引入了一個局部作用域,變量i就存在于這個局部作用域中,但對外不可見,因此,接下來在printf函數中對變量i的引用會引發編譯錯誤。

但是,在Python中卻并非如此:

if True:
    i = 0
print i

在上述代碼中,if子句并沒有引入一個局部作用域,變量i仍然處在全局作用域中,因此,變量i對于接下來的print語句是可見的。

實際上,在Python中,只有模塊,類以及函數才會引入新的作用域,其它的代碼塊是不會引入新的作用域的。

在Python中,使用一個變量之前不必預先聲明它,但是在真正使用它之前,它必須已經綁定到某個對象;而名字綁定將在當前作用域中引入新的變量,同時屏蔽外層作用域中的同名變量,不論這個名字綁定發生在當前作用域中的哪個位置。

>>> f()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in f
NameError: name 'i' is not defined
>>>

運行結果報錯

NameError: name ‘i’ is not defined

程序運行時,Python首先在函數f的本地作用域中查找變量i,查找失敗,接著在全局作用域和內置作用域中查找變量i,仍然失敗,最終拋出NameError異常。

>>> def f():
...     i = 8
...     print(i)
...
>>> f()
8
>>> print(i)
0
>>>

運行結果顯示

8和0

i = 8是一個名字綁定操作,它在函數f的局部作用域中引入了新的變量i,屏蔽了全局變量i,因此f內部的print語句看到的是局部變量i,f外部的print語句看到的是全局變量i。

>>> i = 0 
>>> def f():
...     print(i)
...     i = 0
...
>>> f()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in f
UnboundLocalError: local variable 'i' referenced before assignment
>>>

運行結果報錯

UnboundLocalError: local variable ‘i’ referenced before assignment

在上述中,函數f中的變量i是局部變量,但是在print語句使用它的時候,它還未被綁定到任何對象之上,所以拋出異常。

3、在Python中,名字綁定在所屬作用域中引入新的變量,同時綁定到一個對象。

名字綁定發生在以下幾種情況之下:

  • 參數聲明:參數聲明在函數的局部作用域中引入新的變量;
  • 賦值操作:對一個變量進行初次賦值會在當前作用域中引入新的變量,后續賦值操作則會重新綁定該變量;
  • 類和函數定義:類和函數定義將類名和函數名作為變量引入當前作用域,類體和函數體將形成另外一個作用域;
  • import語句:import語句在當前作用域中引入新的變量,一般是在全局作用域;
  • for語句:for語句在當前作用域中引入新的變量(循環變量);
  • except語句:except語句在當前作用域中引入新的變量(異常對象);

總結

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!  

相關文章

  • Python常用隨機數與隨機字符串方法實例

    Python常用隨機數與隨機字符串方法實例

    這篇文章主要介紹了Python常用隨機數與隨機字符串方法實例,本文講解了隨機整數、隨機選取0到100間的偶數、隨機浮點數、隨機字符串等常用隨機方法,需要的朋友可以參考下
    2015-04-04
  • 對python中的argv和argc使用詳解

    對python中的argv和argc使用詳解

    今天小編就為大家分享一篇對python中的argv和argc使用詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • python中子類調用父類函數的方法示例

    python中子類調用父類函數的方法示例

    Python中類的初始化方法是__init__(),因此父類、子類的初始化方法都是這個,下面這篇文章主要給大家介紹了關于python中子類調用父類函數的方法示例,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下。
    2017-08-08
  • PyTorch dropout設置訓練和測試模式的實現

    PyTorch dropout設置訓練和測試模式的實現

    這篇文章主要介紹了PyTorch dropout設置訓練和測試模式的實現方式,具有很好的參考價值,希望對大家有所幫助。
    2021-05-05
  • python 表格打印代碼實例解析

    python 表格打印代碼實例解析

    這篇文章主要介紹了python 表格打印代碼實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • 解決Django Static內容不能加載顯示的問題

    解決Django Static內容不能加載顯示的問題

    今天小編就為大家分享一篇解決Django Static內容不能加載顯示的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Python 堆疊柱狀圖繪制方法

    Python 堆疊柱狀圖繪制方法

    這篇文章主要介紹了Python 堆疊柱狀圖繪制方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-07-07
  • pandas.dataframe中根據條件獲取元素所在的位置方法(索引)

    pandas.dataframe中根據條件獲取元素所在的位置方法(索引)

    今天小編就為大家分享一篇pandas.dataframe中根據條件獲取元素所在的位置方法(索引),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • Python從列表推導到zip()函數的5種技巧總結

    Python從列表推導到zip()函數的5種技巧總結

    在本篇文章里小編給大家整理的是關于Python從列表推導到zip()函數的5種技巧的相關知識點和代碼,需要的朋友們參考學習下。
    2019-10-10
  • python讀取圖片任意范圍區域

    python讀取圖片任意范圍區域

    這篇文章主要為大家詳細介紹了python讀取圖片任意范圍區域,以一維數組形式返回,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01

最新評論

免费人成视频在线观看