變量的引用
創(chuàng)新互聯(lián)公司為您提適合企業(yè)的網(wǎng)站設計?讓您的網(wǎng)站在搜索引擎具有高度排名,讓您的網(wǎng)站具備超強的網(wǎng)絡競爭力!結(jié)合企業(yè)自身,進行網(wǎng)站設計及把握,最后結(jié)合企業(yè)文化和具體宗旨等,才能創(chuàng)作出一份性化解決方案。從網(wǎng)站策劃到成都網(wǎng)站設計、做網(wǎng)站, 我們的網(wǎng)頁設計師為您提供的解決方案。
變量和數(shù)據(jù)都是保存在內(nèi)存中的
變量和數(shù)據(jù)是分開存儲的
數(shù)據(jù)保存在內(nèi)存中某個位置,通過地址來標記
變量保存的是數(shù)據(jù)的地址,通過地址可以找到數(shù)據(jù)在內(nèi)存空間的位置
把變量保存數(shù)據(jù)地址的過程稱為引用
變量的重新賦值修改的是變量中引用數(shù)據(jù)的內(nèi)存地址
變量之間的賦值實際是引用的傳遞
函數(shù)參數(shù)的傳遞,本質(zhì)也是引用的傳遞
函數(shù)的返回值本身也是引用的傳遞
可變和不可變類型
不可變類型,內(nèi)存中的數(shù)據(jù)不允許被修改:數(shù)字類型(int,bool,float,complex,long(2,x)、字符串、元組(tuple)
可變類型,內(nèi)存中的數(shù)據(jù)可以被修改:列表list、字典dict
無論是可變還是不可變數(shù)據(jù)類型,通過賦值語句,都會改變變量的引用
Hash函數(shù)只能接收不可變數(shù)據(jù)類型,字典的鍵也只能是不可變數(shù)據(jù)類型,字典的value值可以是任意數(shù)據(jù)類型
局部變量
1.在函數(shù)內(nèi)部定義的變量就是局部變量(作用范圍只能是當前函數(shù)內(nèi)部)
2.在函數(shù)外部無法直接訪問局部變量
3.不同的函數(shù)中可以定義同名的局部變量
4.局部變量的生命周期:從定義變量時開始,到函數(shù)運行結(jié)束
全局變量
1.在所有函數(shù)外邊定義的變量就是全局變量
2.讓所有函數(shù)都能訪問到,可以作為函數(shù)通信的橋梁
3.一般情況下,為了和普通變量的區(qū)別,需要加上g_或gl_前綴
4.全局變量一般放在所有函數(shù)的最上面
5.在函數(shù)內(nèi)部修改全局變量,必須要加上global關鍵字,如果不加global只是定義了一個同名的局部變量
函數(shù)的多個返回值
(1)簡單數(shù)據(jù)類型變量無論是否與全局變量重名,僅在函數(shù)內(nèi)部創(chuàng)建和使用,函數(shù)退出后變量被釋放,如有全局同名變量,其值不變。
(2)簡單數(shù)據(jù)類型變量在用global保留字聲明后,作為全局變量使用,函數(shù)退出后該變量保留且值被函數(shù)改變。
(3)對于組合數(shù)據(jù)類型的全局變量,如果在函數(shù)內(nèi)部沒有被真實創(chuàng)建的同名變量,則函數(shù)內(nèi)部可以直接使用并修改全局變量的值。
(4)如果函數(shù)內(nèi)部真實創(chuàng)建了組合數(shù)據(jù)類型變量,無論是否有同名全局變量,函數(shù)僅對局部變量進行操作,函數(shù)退出后局部變量被釋放,全局變量值不變。
*《python語言程序設計基礎》.高等教育出版社
在python中,函數(shù)可以被嵌套定義,也就是說,函數(shù)中可以定義函數(shù)。該函數(shù)還可以將其內(nèi)部定義的函數(shù)作為返回值返回。
閉包的定義:一般來說,我們可以認為,如果一個函數(shù)可以讀取其他函數(shù)中的局部變量,那么它們就構(gòu)成了閉包。
注意 :閉包的定義不是特別清晰,但大體上的意思是這樣的。
我們知道,普通的函數(shù)是可以使用全局變量的
類似的,函數(shù)中定義的函數(shù),也是可以使用外部函數(shù)的變量的。因此,滿足了函數(shù)讀取了其他函數(shù)局部變量的這一條件,他們因此構(gòu)成了閉包。
在閉包的使用中,我們可以先給外部的函數(shù)賦予不同的局部變量,然后再調(diào)用其中內(nèi)部的函數(shù)時,就可以讀取到這些不同的局部變量了。
外部變量的使用 在普通函數(shù)中,雖然可以直接使用全局變量,但是不可以直接修改全局變量。從變量的作用域來說,一旦你嘗試修改全局變量,那么就會嘗試創(chuàng)建并使用一個同名的局部變量。因此,如果你需要在普通函數(shù)中修改全局變量,需要使用global
同樣的,如果你希望通過定義在內(nèi)部的函數(shù)去修改其外部函數(shù)的變量,那么必須使用nonlocal
嵌套函數(shù)在執(zhí)行時(而不是在定義時)從父范圍中查找變量。
編譯函數(shù)主體,然后驗證“自由”變量(未在函數(shù)本身中通過賦值定義),然后將其作為閉包單元綁定到函數(shù),并且代碼使用索引引用每個單元格。pet_function因此具有一個自由變量(cage),然后將其通過一個閉合單元引用,索引為0的閉合本身指向局部變量cage在get_petters功能。
當你實際調(diào)用該函數(shù)時,該閉包將用于在你調(diào)用該函數(shù)時查看cage周圍作用域中的值。問題就在這里。在你調(diào)用函數(shù)時,該函數(shù)已經(jīng)完成了對其結(jié)果的計算。將在在執(zhí)行過程中的一些點局部變量分配各的,和字符串,但在功能的結(jié)束,包含了最后一個值。因此,當你調(diào)用每個動態(tài)返回的函數(shù)時,就會得到打印的值。get_petterscage'cow''dog''cat'cage'cat''cat'
解決方法是不依賴閉包。你可以改用部分函數(shù),創(chuàng)建新的函數(shù)作用域或?qū)⒆兞拷壎殛P鍵字parameter的默認值。
部分函數(shù)示例,使用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)))
創(chuàng)建一個新的范圍示例:
def scoped_cage(cage=None):
def pet_function():
print "Mary pets the " + cage.animal + "."
return pet_functionyield (animal, partial(gotimes, scoped_cage(cage)))
將變量綁定為關鍵字參數(shù)的默認值:
def pet_function(cage=cage):
print "Mary pets the " + cage.animal + "."yield (animal, partial(gotimes, pet_function))
無需scoped_cage在循環(huán)中定義函數(shù),編譯僅進行一次,而不是在循環(huán)的每次迭代中進行。