python局部變數
⑴ python-嵌套函數中的局部變數
嵌套函數在執行時(而不是在定義時)從父范圍中查找變數。
編譯函數主體,然後驗證「自由」變數(未在函數本身中通過賦值定義),然後將其作為閉包單元綁定到函數,並且代碼使用索引引用每個單元格。pet_function因此具有一個自由變數(cage),然後將其通過一個閉合單元引用,索引為0的閉合本身指向局部變數cage在get_petters功能。
當你實際調用該函數時,該閉包將用於在你調用該函數時查看cage周圍作用域中的值。問題就在這里。在你調用函數時,該函數已經完成了對其結果的計算。將在在執行過程中的一些點局部變數分配各的,和字元串,但在功能的結束,包含了最後一個值。因此,當你調用每個動態返回的函數時,就會得到列印的值。get_petterscage'cow''dog''cat'cage'cat''cat'
解決方法是不依賴閉包。你可以改用部分函數,創建新的函數作用域或將變數綁定為關鍵字parameter的默認值。
部分函數示例,使用functools.partial():
from functools import partialdef pet_function(cage=None):
print "Mary pets the " + cage.animal + "."yield (animal, partial(gotimes, partial(pet_function, cage=cage)))
創建一個新的范圍示例:
def scoped_cage(cage=None):
def pet_function():
print "Mary pets the " + cage.animal + "."
return pet_functionyield (animal, partial(gotimes, scoped_cage(cage)))
將變數綁定為關鍵字參數的默認值:
def pet_function(cage=cage):
print "Mary pets the " + cage.animal + "."yield (animal, partial(gotimes, pet_function))
無需scoped_cage在循環中定義函數,編譯僅進行一次,而不是在循環的每次迭代中進行。
⑵ python中變數的引用、可變和不可變類型、局部變數和全局變數
變數的引用
變數和數據都是保存在內存中的
變數和數據是分開存儲的
數據保存在內存中某個位置,通過地址來標記
變數保存的是數據的地址,通過地址可以找到數據在內存空間的位置
把變數保存數據地址的過程稱為引用
變數的重新賦值修改的是變數中引用數據的內存地址
變數之間的賦值實際是引用的傳遞
函數參數的傳遞,本質也是引用的傳遞
函數的返回值本身也是引用的傳遞
可變和不可變類型
不可變類型,內存中的數據不允許被修改:數字類型(int,bool,float,complex,long(2,x)、字元串、元組(tuple)
可變類型,內存中的數據可以被修改:列表list、字典dict
無論是可變還是不可變數據類型,通過賦值語句,都會改變變數的引用
Hash函數只能接收不可變數據類型,字典的鍵也只能是不可變數據類型,字典的value值可以是任意數據類型
局部變數
1.在函數內部定義的變數就是局部變數(作用范圍只能是當前函數內部)
2.在函數外部無法直接訪問局部變數
3.不同的函數中可以定義同名的局部變數
4.局部變數的生命周期:從定義變數時開始,到函數運行結束
全局變數
1.在所有函數外邊定義的變數就是全局變數
2.讓所有函數都能訪問到,可以作為函數通信的橋梁
3.一般情況下,為了和普通變數的區別,需要加上g_或gl_前綴
4.全局變數一般放在所有函數的最上面
5.在函數內部修改全局變數,必須要加上global關鍵字,如果不加global只是定義了一個同名的局部變數
函數的多個返回值
⑶ Python中的變數按所在位置和作用范圍有哪些類型呢
在python程序中,變數可以根據變數所在位置和作用范圍分為局部變數和全局變數兩種,局部變數僅在函數內部存在,作用域也只有函數內部。全局變數作用域為多個函數均可使用。
一、局部變數
局部變數是在某個函數中聲明的,只能在該函數中調用它,如果試圖在超出范圍的地方調用,則會出現錯誤。(在函數中使用後,局部變數就會被釋放,所以無法在其他范圍內被調用)
二、全局變數
全局變數是指在整個.py文件中定義的變數,在程序執行的全過程均有效。全局變數在函數內部使用時,需要使用保留字global進行聲明。
(在聲明全局變數時,變數名不可改變!)
⑷ python中局部變數和全局變數的區別
全局變數:在函數外或全局空間中聲明的變數稱為全局變數,這些變數可以由程序中的任何函數訪問;
局部變數:在函數內聲明的任何變數都稱為局部變數,此變數存在局部空間中,而不是全局空間中。
⑸ Python類中self的作用
舉例如下:
其中,self是對於對象自身的引用。
在這里,self 改變了變數的作用域。
不加 self 的變數是局部變數,作用域是當前函數;加了 self 的變數是實例變數,作用域是當前實例。
也就是,我們在外部將類 Person 實例化時,可以調用它的 inputname 變數,因為這個變數是實例變數,作用域當前實例,卻調用不了 input1 變數,因為這個變數是局部變數,只能在setName 函數中使用。
我們這里假設 lil = Person(),其中 lil 是 Person 類的一個實例。
當我們調用 lil 的 setName 和 getName 或 greet 方法時,lil 自動將自己作為第一個參數,傳入函數中,因此形象的稱為 self
所以 self 是一個實例,指的實例本身。
通過使用 self,我們可以在其成員方法中訪問他們要對其特性進行操作的對象本身了。
這樣說很拗口,換句話說,我們通過使用 self,將 attribute 的作用域從當前函數 變成 當前實例,這樣這個 attribute 就可以在整個實例中都有效。這樣便於我們在不同的成員方法中對這個 attribute 進行操作。例如上面例子中的 self.name ,因為使用了 self,我們在 getName 和 greet 中均可以使用該實例變數。
而且,對於實例 lil,我們也可以直接調用 name 這個attribute,也就是 lil.name ,是有效的。但是 lil.input1 是無效的,會提示「類裡面沒有這個屬性」。
⑹ Python中的類變數、實例變數、局部變數
類體內,所有函數外定義。
所有實例對象共享。
只有通過類名調用時才能修改,通過實例調用時無法修改。
假設某類變數名為「name",如果用該類的某個實例x來為name賦值:x.name = 'xxx',實質是為該實例新定義了一個變數name。且之後無法再通過該實例調用類變數name了。因為使用實例調用某名為「xxx」變數時,若該實例沒有名為「xxx」的實例變數,則會去調用名為「xxx」的類變數;若有該名稱的實例變數,則該實例無法再直接調用該名稱對應的類變數。因此也不推薦通過實例來調用類變數。
即:通過類實例修改類變數的值時,實際是在定義新的與類變數同名的實例變數。
類體內,某函數(一般是__ init __ ())內定義。 「self.變數名」
因為是屬於某個具體實例的,因此不能通過類名訪問。
如果不在__ init __ () 中調用(該函數會在創建實例時自動調用一次),則只有調用該實例中定義目標實例變數的那個函數後,才能使用目標實例變數。因此最好在__ init __ () 中定義實例變數。
類體內,某函數內定義。
直接在函數內用「變數名=值」的方式進行定義。
函數執行完畢後,該局部變數即被銷毀。