變量的應用算法
可變和不可變類型函數
局部變量和全局變量spa
變量和數據都是保存在內存中的code
在Python中函數的參數傳遞以及返回值都是靠引用傳遞的blog
在Python中生命週期
變量和數據是分開存儲的內存
數據保存在內存中的一個位置開發
變量中保存着數據在內存中的地址字符串
變量中記錄數據的地址,就叫作引用pycharm
注意:若是變量已經被定義,當給一個變量賦值的時候,本質上是修改了數據的應用
變量再也不對以前的數據引用
變量改成對新賦值的數據引用
在Python中,函數的實參/返回值都是靠引用來傳遞的
# 函數實參的引用傳遞
def test(num): print("在函數內部 %d 對應的內存地址是 %d" % (num,id(num))) # 1.定義一個數字的變量 a = 10 # 數據的地址本質上就是一個數字 print("a 變量保存數據的內存地址是 %d" % id(a)) # 2.調用test函數 本質上傳遞的是實參保存數據的引用,而不是實參保存的數據 test(a)
def test(num): print("在函數內部 %d 對應的內存地址是 %d" % (num,id(num))) # 1> 定義一個字符串變量 result = "hello" print("函數要返回數據的內存地址是 %d" % id(result)) # 2> 將字符串變量返回,返回的是數據的引用,而不是數據自己 return result # 1.定義一個數字的變量 a = 10 # 數據的地址本質上就是一個數字 print("a 變量保存數據的內存地址是 %d" % id(a)) # 2.調用test函數 本質上傳遞的是實參保存數據的引用,而不是實參保存的數據 # 注意:若是函數有返回值,可是沒有定義變量接收 # 程序不會報錯,可是沒法得到返回結果 r = test(a) print("%s 的內存地址是 %d" % (r,id(r)))
不可變類型,內存中的數據不容許被修改:
數字類型 int,bool,float,complex,long(2,x)
字符串 str
元組 tuple
可變類型,內存中的數據能夠被修改:
列表 list
字典 dict
注意:字典的key只能使用不可變類型的數據
注意:
1.可變類型的數據變化,是經過方法來實現的
2.若是給一個可變類型的變量,賦值了一個新的數據,引用會修改
變量再也不對以前的數據引用
變量改成對新賦值的數據引用
Python中內置有一個名字叫作 hash(o)的函數
接收一個不可變類型的數據做爲參數
返回結果是一個整數
哈希 是一種算法,其做用就是提取數據的特徵碼(相似指紋)
相同的內容獲得相同的結果
不一樣的內容獲得不一樣的結果
在Python中,設置字典的鍵值對時,會首先對key進行hash已決定如何在內存中保存字典的數據,以方便後續對字典的操做:增、刪、改、查
鍵值對的key必須是不可變類型數據
鍵值對的value能夠是任意類型的數據
局部變量是在函數內部定義的變量,只能在函數內部使用
全局變量是在函數外部定義的變量(沒有定義在某一個函數內),全部函數內部均可以使用這個變量
提示:在其餘的開發語言中,大多不推薦使用全局變量——可變範圍太大,致使程序很差維護!
局部變量是在函數內部定義的變量,只能在函數內部使用
函數執行結束後函數內部的局部變量會被系統回收
不一樣的函數能夠定義相同的名字的局部變量,可是各用個的不會產生影響
局部變量的做用
在函數內部使用,臨時保存函數內部須要使用的數據
def demo1(): # 定義一個局部變量 num = 10 print("在demo1函數內部的變量是 %d" % num) def demo2(): # print("%d" % num) 函數內部定義的變量不能在另外一個函數內使用 pass # 在函數內部定義的變量,不能再其餘位置使用 # print("%d" % num) 函數內部定義的變量不能在函數外部使用 demo1() demo2()
局部變量的生命週期
# 所謂 生命週期 就是變量從被建立到被系統回收的過程 # 局部變量 在函數執行時纔會被建立 # 函數執行結束後 函數變量 被系統回收 # 局部變量在生命週期內,能夠用來存儲函數內部臨時使用到的數據
# 1> 出生:執行了下方代碼以後,變量纔會被建立
# 2> 死亡:函數執行完成以後,變量會被系統回
全局變量是在函數外部定義的變量,全部的函數內部均可以使用這個變量
# 全局變量 num = 10 def demo1(): print("demo1 ==> %d" % num) def demo2(): print("demo2 ==> %d" % num) demo1() demo2()
注意:函數執行時,須要處理變量時會:
1.首先查找函數內部時候存在指定名稱的局部變量,若是有,直接使用
2.若是沒有,查找函數外部是否存在指定名稱的全局變量,若是有,直接使用
3.若是尚未,程序報錯!
1)函數不能直接修改全局變量的引用
全局變量是在函數外部定義的變量(沒有定義在某一個函數內),全部函數內部均可以使用這個變量
提示:在其餘開發語言中,大多不推薦使用全局變量——可變範圍太大,致使程序很差維護
在函數內部,能夠經過全局變量的引用獲取對應的數據
可是,不容許直接修改全局變量的引用——使用賦值語句修改全局變量的值
# 全局變量 num = 10 def demo1(): # 但願修改全局變量的值 # 在Python中,不容許直接修改全局變量的值 # 若是使用賦值語句,會在函數內部,定義一個局部變量 num = 99 print("demo1 ==> %d" % num) def demo2(): print("demo2 ==> %d" % num) demo1() demo2()
# 注意:只有在函數內部定義了一個函數變量而已,只是變量名相同——在函數內部不能直接修改全局變量的值
2)在函數內部修改全局變量的值
若是在函數中須要修改全局變量,須要使用global進行聲明
# 修改全局變量 num = 10 def demo1(): # 但願修改全局變量的值 ——使用global聲明一下變量便可 # 當下面的函數調用到全局變量時,調用的就是在這個函數中修改後的值 global num num = 99 print("demo1 ==> %d" % num) def demo2(): print("demo2 ==> %d" % num) demo1() demo2()
3)全局變量定義的位置
爲了保證全部的函數都可以正確使用到全局變量,應該將全局變量定義在其餘函數的上方
# 注意:在開發時,應該把模塊中的全部全局變量 # 定義在全部函數上方,就能夠保證全部的函數 # 都可以正常的訪問到每一個全局變量了 num = 10 def demo(): print("%d" % num) print("%s" % title) # print("%s" % name) # 在定義一個全局變量 title = "hmcxy" demo() # 再定義一個全局變量 # name = "xiaoming" 由於該全局變量定義在函數下方, # 致使系統再未定義該變量以前就運行到了函數demo
注意:若是全局變量在調用函數以後才定義,在執行函數時,變量尚未定義,因此程序會報錯
4)全局變量命名的建議
爲了不局部變量和全局變量出現混淆,在定義全局變量時,有些公司會有一些開發要求,例如:
全局變量名前應該增長g_或者gl_的前綴
提示:具體的要求格式,各公司要求可能會有些差別
gl_num = 10 # 在定義一個全局變量 gl_title = "小明" # 再定義一個全局變量 gl_name = "小王" def demo(): # 若是局部變量的名字和全局變量的名字相同 # pycharm會在局部變量下方顯示一個波浪線 提示可能會產生混淆 num = 99 print("%d" % num) print("%s" % gl_title) print("%s" % gl_name) demo()
當程序中多個相同變量名須要修改時,能夠將鼠標防止到須要修改的變量名上,右鍵 refactor rename