導航:首頁 > 編程語言 > python類作用域

python類作用域

發布時間:2024-06-15 19:05:46

python裡面變數作用域是什麼

變數作用域:python可以直接查找名稱到對象的映射(命名空間)的部分。

python有built–in、global、enclosing、local這四種作用域

built–in:內建作用域,包含了內建的變數和關鍵字。

global:全局作用域,定義在所有函數外,當前模塊(.py源文件)的全局變數。

enclosing:閉包函數外的函數(非局部也非全局),比如有一個函數a,a里有另一個函數b,對於b里的變數來說,a中的作用域就是enclosing。

local:局部作用域,腳本最內層,比如函數里。

Ⅱ Python 中作用域與命名空間的問題

i=2這一句是定義了一個局部變數i,並賦值為2;這個時候全局作用域的i會被屏蔽,所以全局變數i是沒有被修改的所以結果是1;


訪問全局變數時可以直接訪問,但是修改全局作用域的時候一定要在賦值之前,進行如下聲明:

deff():

globali


i=2


因為python里賦值語句和聲明變數是一個體的,所以需要global來告訴解釋器i是全局變數,接下來的i=2才能被當作是賦值

------------------追答---------------------

同一個代碼塊(作用域)里, 同一個變數的作用域只能是同一種或者說同一個變數只能來自同一個作用域, 不能是一會是局部變數然後又變成全局變數;

i = i + 1

首先前面的'i='表明了i是一個局部變數(沒有global聲明, 創建局部變數), 然後後面的'i+1'里的i自然也是局部變數(同一個函數下同一個變數,i已經是局部變數了, 不能再當作全局變數去用), 那麼自然會報錯, i在使用前未聲明

i += 1

報錯就更明顯了, 沒有global聲明 那麼再修改變數i的時候, 自然是當作局部變數, 使用前未聲明

變數的查找順序遵循 LEGB 可以自己網路

關於作用域給你再寫個簡單的示例, 你對照著理解一下

Ⅲ #抬抬小手學Python# Python 之作用域下的 global 和 nonlocal 關鍵字

該部分內容涉及 Python 變數作用域相關知識,變數作用域指的是變數的有效作用范圍,直接理解就是 Python 中的變數不是任意位置都可以訪問的,有限制條件。

一般情況下變數的作用域變化范圍是 塊級、函數、類、模塊、包等,級別是從小到達。Python 中是沒有塊級作用域的,所以我們在寫代碼的時候,下面的代碼是正確的。

在 Python 中常見的塊級作用域有 if 語句、for 語句、while 語句、with 上下文語句。

上文已經提及了作用域是 Python 程序可以直接訪問一個變數的作用范圍,Python 的作用域一共有 4 種,分別如下:

一個比較經典的案例如下:

在 Python 中變數尋找的順序是從內到外,先局部,然後外部,在全局,在內建,這種規則叫做 LEGB 規則 。

增加以下學習的趣味性,你可以研究下述代碼中變數是如何變化的。

定義在 函數內部 的變數擁有一個局部作用域,定義在 函數外部 的變數擁有全局作用域。

輸出結果,函數內部是 123 ,函數外部依舊是 0 。

如果希望函數內部(內部作用域)可以修改外部作用域的變數,需要使用 global 關鍵字。

此時輸出的就都是 123 了,還有一點需要注意,在函數內容如果希望修改全局變數的值, global 關鍵字一定要寫在變數操作前。

該代碼會出現語法錯誤:

全局變數還存在一個面試真題,經常出現,請問下述代碼運行結果。

如果要修改嵌套作用域(Enclosing 作用域)中的變數,需要 nonlocal 關鍵字,測試代碼如下:

輸出結果自行測試,注意 nonlocal 關鍵字必須是 Python3.X+版本,Python 2.X 版本會出現語法錯誤:

在多重嵌套中, nonlocal 只會上溯一層,如果上一層沒有,則會繼續上溯,下述代碼你可以分別注釋查看結果。

局部變數和全局變數具體有哪些,可以通過 locals() 和 globals() 兩個內置函數獲取。

本篇博客為大家說明了 Python 的作用域,並且對 global 和 nonlocal 關鍵字進行了學習,希望對你有所幫助。

Ⅳ 談談python中類屬性和類實例的屬性的區別

一般來說,在Python中,類實例屬性的訪問規則算是比較直觀的。

但是,仍然存在一些不是很直觀的地方,特別是對C++和Java程序員來說,更是如此。

在這里,我們需要明白以下幾個地方:

1.Python是一門動態語言,任何實體都可以動態地添加或刪除屬性。
2.一個類定義了一個作用域。
3.類實例也引入了一個作用域,這與相應類定義的作用域不同。
4.在類實例中查找屬性的時候,首先在實例自己的作用域中查找,如果沒有找到,則再在類定義的作用域中查找。
5.在對類實例屬性進行賦值的時候,實際上會在類實例定義的作用域中添加一個屬性(如果還不存在的話),並不會影響到相應類中定義的同名屬性。

下面看一個例子,加深對上述幾點的理解:

復制代碼
代碼如下:

class A:
cls_i = 0
cls_j
= {}
def __init__(self):
self.instance_i =
0
self.instance_j =
{}

在這里,我們先定義類A的一個實例a,然後再看看類A的作用域和實例a的作用域中分別有什麼:

復制代碼
代碼如下:

>>> a = A()
>>>
a.__dict__
{'instance_j': {}, 'instance_i': 0}
>>>
A.__dict__
{'__init__': , '__mole__': '__main__', 'cls_i': 0, 'cls_j': {},
'__doc__': None}

我們看到,a的作用域中有instance_i和instance_j,A的作用域中有cls_i和cls_j。

我們再來看看名字查找是如何發生的:

復制代碼
代碼如下:

>>> a.cls_i
0
>>>
a.instance_i
0

在查找cls_i的時候,實例a的作用域中是沒有它的,卻在A的作用域中找到了它;在查找instance_i的時候,直接可在a的作用域中找到它。

如果我們企圖通過實例a來修改cls_i的值,那會怎樣呢:

復制代碼
代碼如下:

>>> a.cls_i = 1
>>>
a.__dict__
{'instance_j': {}, 'cls_i': 1, 'instance_i': 0}
>>>
A.__dict__
{'__init__': , '__mole__': '__main__', 'cls_i': 0, 'cls_j': {},
'__doc__': None}

我們可以看到,a的作用域中多了一個cls_i屬性,其值為1;同時,我們也注意到A作用域中的cls_i屬性的值仍然為0;在這里,我們其實是增加了一個實例屬性,並沒有修改到類屬性。

如果我們通過實例a操縱cls_j中的數據(注意不是cls_j本身),又會怎麼樣呢:

復制代碼
代碼如下:

>>> a.cls_j['a'] =
'a'
>>> a.__dict__
{'instance_j': {}, 'cls_i': 1, 'instance_i':
0}
>>> A.__dict__
{'__init__': , '__mole__': '__main__',
'cls_i': 0, 'cls_j': {'a': 'a'}, '__doc__': None}

我們可以看到a的作用域沒有發生什麼變化,但是A的作用域發生了一些變化,cls_j中的數據發生了變化。

實例的作用域發生變化,並不會影響到該類的其它實例,但是類的作用域發生變化,則會影響到該類的所有實例,包括在這之前創建的實例:

復制代碼
代碼如下:

>>> A.cls_k = 0

Ⅳ Python語言中作用域怎麼理解

命名空間 是從命名到對象的映射。當前命名空間主要是通過 Python 字典實現的,不過通常不關心具體的實現方式(除非出於性能考慮),以後也有可能會改變其實現方式。以下有一些命名空間的例子:內置命名(像 abs() 這樣的函數,以及內置異常名)集,模塊中的全局命名,函數調用中的局部命名。某種意義上講對象的屬性集也是一個命名空間。關於命名空間需要了解的一件很重要的事就是不同命名空間中的命名沒有任何聯系,例如兩個不同的模塊可能都會定義一個名為 maximize 的函數而不會發生混淆-用戶必須以模塊名為前綴來引用它們。
順便提一句,我稱 Python 中任何一個「.」之後的命名為 屬性 --例如,表達式 z.real 中的 real 是對象 z 的一個屬性。嚴格來講,從模塊中引用命名是引用屬性:表達式 modname.funcname 中,modname 是一個模塊對象,funcname 是它的一個屬性。因此,模塊的屬性和模塊中的全局命名有直接的映射關系:它們共享同一命名空間![1]
屬性可以是只讀過或寫的。後一種情況下,可以對屬性賦值。你可以這樣做: modname.the_answer = 42 。可寫的屬性也可以用 del 語句刪除。例如: del modname.the_answer 會從 modname 對象中刪除 the_answer 屬性。
不同的命名空間在不同的時刻創建,有不同的生存期。包含內置命名的命名空間在 Python 解釋器啟動時創建,會一直保留,不被刪除。模塊的全局命名空間在模塊定義被讀入時創建,通常,模塊命名空間也會一直保存到解釋器退出。由解釋器在最高層調用執行的語句,不管它是從腳本文件中讀入還是來自互動式輸入,都是 __main__ 模塊的一部分,所以它們也擁有自己的命名空間(內置命名也同樣被包含在一個模塊中,它被稱作 builtins )。
當調用函數時,就會為它創建一個局部命名空間,並且在函數返回或拋出一個並沒有在函數內部處理的異常時被刪除。(實際上,用遺忘來形容到底發生了什麼更為貼切。)當然,每個遞歸調用都有自己的局部命名空間。
作用域 就是一個 Python 程序可以直接訪問命名空間的正文區域。這里的直接訪問意思是一個對名稱的錯誤引用會嘗試在命名空間內查找。盡管作用域是靜態定義,在使用時他們都是動態的。每次執行時,至少有三個命名空間可以直接訪問的作用域嵌套在一起:

Ⅵ python中函數變數作用域和類變數作用域怎麼搞都錯,煩躁中

python中,變數的作用域要弄清楚。只有mole、class、def、lambda才會引入作用域,其他的代碼塊是不會引入作用域的。
1
圖一中,你在函數中聲明了d為全局變數,但這樣是無效的,程序運行結果,已經說明這一點。

global這個關鍵字,是用來「在函數中修改全局變數值」的聲明,而不是「在局部函數中定義一個全局變數」的聲明。這里要注意一下。
你可以再局部函數外面聲明變數d,再加上你原先的函數,就可以修改、訪問這個變數了。

2
在類中函數的變數,作用域只在函數中。圖二中,jian這個變數分別在yu(),yu1()兩個函數中,是處於不同的定義域中的,是不能相互訪問的。
所以,在各自函數中,只有先定義了jian變數,才能再使用。
如果想在yu1()中訪問yu()中的jian變數,就需要將jian變數變成全局變數,即在class中定義一個全局變數jian,這樣yu1(),yu()函數都可以訪問了

Ⅶ Python涓浣跨敤鐨勫彉閲忥紝鍏朵綔鐢ㄥ煙鏈夊摢浜涳紵璇風畝鍗曡存槑鍏跺悇鑷鐨勪綔鐢ㄨ寖鍥淬

鍙橀噺鐨勪綔鐢ㄥ煙鏈夊矓閮ㄤ綔鐢ㄥ煙錛圠ocal錛夈侀棴鍖呭嚱鏁幫紙Enclosing錛夈佸叏灞浣滅敤鍩燂紙Global錛夈佸唴緗浣滅敤鍩燂紙Built-in錛夊洓縐嶃備嬌鐢ㄦ椂錛屾寜鐓 L銆丒銆丟銆丅鐨勯『搴忔煡鎵撅紝鍗沖湪灞閮ㄦ壘涓嶅埌錛屽垯鍘誨矓閮ㄥ栫殑灞閮ㄦ壘錛堜緥濡傞棴鍖咃級錛屽傛灉鍐嶆壘涓嶅埌灝變細鍘誨叏灞鎵撅紝鍐嶈呭幓鍐呯疆涓鎵俱

閱讀全文

與python類作用域相關的資料

熱點內容
怎麼做用指甲油做的解壓球 瀏覽:735
遞歸編程與數學應用 瀏覽:928
驚變1小時8分鍾才是經典 瀏覽:724
ps如何pdf製作 瀏覽:782
如何按照序號排列文件夾 瀏覽:433
演算法設計與分析基礎網盤 瀏覽:712
linux信號量的使用 瀏覽:61
朴初炫演過的電影 瀏覽:969
掌閱下的書在哪個文件夾 瀏覽:851
程序員學python難嗎 瀏覽:737
源泉插件圖紙加密 瀏覽:609
minitab編程 瀏覽:231
網頁編程語言大全 瀏覽:633
單片機鋰離子 瀏覽:9
單片機交流電流測量 瀏覽:717
小雞模擬器ios游戲一直正在解壓 瀏覽:928
可以把文件夾轉化為文檔的軟體 瀏覽:956
微軟認證高級程序員 瀏覽:887
人工智慧網路演算法工程師 瀏覽:459
白色邊框app是什麼 瀏覽:740