溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python函數(shù)中的作用域規(guī)則實例分析

發(fā)布時間:2022-03-10 16:34:19 來源:億速云 閱讀:207 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹了Python函數(shù)中的作用域規(guī)則實例分析的相關(guān)知識,內(nèi)容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Python函數(shù)中的作用域規(guī)則實例分析文章都會有所收獲,下面我們一起來看看吧。

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

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

1、簡單介紹一下閉包

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

在上述此代碼中stu方法定義在test的內(nèi)部,內(nèi)部函數(shù)stu即可以使用外部函數(shù)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函數(shù)中對變量i的引用會引發(fā)編譯錯誤。

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

if True:
    i = 0
print i

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

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

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

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

運行結(jié)果報錯

NameError: name &lsquo;i&rsquo; is not defined

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

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

運行結(jié)果顯示

8和0

i = 8是一個名字綁定操作,它在函數(shù)f的局部作用域中引入了新的變量i,屏蔽了全局變量i,因此f內(nèi)部的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
>>>

運行結(jié)果報錯

UnboundLocalError: local variable &lsquo;i&rsquo; referenced before assignment

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

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

名字綁定發(fā)生在以下幾種情況之下:

  • 參數(shù)聲明:參數(shù)聲明在函數(shù)的局部作用域中引入新的變量;

  • 賦值操作:對一個變量進行初次賦值會在當(dāng)前作用域中引入新的變量,后續(xù)賦值操作則會重新綁定該變量;

  • 類和函數(shù)定義:類和函數(shù)定義將類名和函數(shù)名作為變量引入當(dāng)前作用域,類體和函數(shù)體將形成另外一個作用域;

  • import語句:import語句在當(dāng)前作用域中引入新的變量,一般是在全局作用域;

  • for語句:for語句在當(dāng)前作用域中引入新的變量(循環(huán)變量);

  • except語句:except語句在當(dāng)前作用域中引入新的變量(異常對象);

關(guān)于“Python函數(shù)中的作用域規(guī)則實例分析”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“Python函數(shù)中的作用域規(guī)則實例分析”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI