麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Python > 正文

Python中的作用域規則詳解

2020-02-23 06:22:20
字體:
來源:轉載
供稿:網友

Python是靜態作用域語言,盡管它自身是一個動態語言。也就是說,在Python中變量的作用域是由它在源代碼中的位置決定的,這與C有些相似,但是Python與C在作用域方面的差異還是非常明顯的。

接下來會談論Python的作用域規則,在這中間也會說明一下Python與C在作用域方面的不同。

在Python 2.0及之前的版本中,Python只支持3種作用域,即局部作用域,全局作用域,內置作用域;在Python 2.2中,Python正式引入了一種新的作用域 --- 嵌套作用域;在Python 2.1中,嵌套作用域可以作為一個選項被開啟;嵌套作用域的引入,本質上為Python實現了對閉包的支持,關于閉包的知識,網上有很多解釋,這里就不詳細展開了。相應地,變量查找順序由之前的LGB變成LEGB(L:Local,E:Enclosing,G:Global,B:Built-in)。

在Python中,并不是任何代碼塊都能引入新的作用域,這與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中,使用一個變量之前不必預先聲明它,但是在真正使用它之前,它必須已經綁定到某個對象;而名字綁定將在當前作用域中引入新的變量,同時屏蔽外層作用域中的同名變量,不論這個名字綁定發生在當前作用域中的哪個位置。
代碼如下:
def f():
    print i
f()

運行結果將顯示:NameError: global name 'i' is not defined。Python首先在函數f的本地作用域中查找變量i,查找失敗,接著在全局作用域和內置作用域中查找變量i,仍然失敗,最終拋出NameError異常。
代碼如下:
i = 0
def f():
    i = 8
    print i
f()
print i

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 国产在线精品一区二区三区不卡 | www.com香蕉| 国产一区二精品区在线 | 国产免费黄网 | 国产亚洲精品久久久久久久软件 | 日日爱影院 | 久久午夜神器 | 日本成人一区二区 | 中文字幕在线第二页 | 高清国产福利 | 一级黄色国产视频 | 午夜亚洲视频 | 一分钟免费观看完整版电影 | 精品999久久久 | 毛片一级网站 | 久久精品无码一区二区三区 | 96视频在线免费观看 | 欧美日韩国产一区二区三区在线观看 | 欧美精品一级片 | 九九热在线视频观看 | 国产成人精品二区 | 久久精品一区二区三区四区五区 | 黄色网址免费在线播放 | 激情小说图| 国产成人免费高清激情视频 | 亚洲成人夜色 | 欧美亚洲免费 | 污版视频在线观看 | 精品久久久久久久久久久久久久 | 黄色片免费在线 | 视频在线91| 午夜小影院 | 亚洲一区在线免费视频 | 欧美成人二区 | 精品一区二区三区在线观看国产 | 精品国产91久久久久久久 | 91懂色| 国产免费人做人爱午夜视频 | 宅男噜噜噜66国产免费观看 | 亚洲成人福利在线观看 | www视频免费观看 |