您好,登錄后才能下訂單哦!
如何在Python中使用變量?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
目標(biāo)
變量的引用
可變和不可變類型
局部變量和全局變量
變量 和 數(shù)據(jù) 都是保存在 內(nèi)存 中的
在 Python 中 函數(shù) 的 參數(shù)傳遞 以及 返回值 都是靠 引用 傳遞的
在 Python 中
變量 和 數(shù)據(jù) 是分開存儲的
數(shù)據(jù) 保存在內(nèi)存中的一個位置
變量 中保存著數(shù)據(jù)在內(nèi)存中的地址
變量 中 記錄數(shù)據(jù)的地址,就叫做 引用
使用 id() 函數(shù)可以查看變量中保存數(shù)據(jù)所在的 內(nèi)存地址
注意:如果變量已經(jīng)被定義,當(dāng)給一個變量賦值的時候,本質(zhì)上是 修改了數(shù)據(jù)的引用
變量 不再 對之前的數(shù)據(jù)引用
變量 改為 對新賦值的數(shù)據(jù)引用
在 Python 中,變量的名字類似于 便簽紙 貼在 數(shù)據(jù) 上
定義一個整數(shù)變量 a,并且賦值為 1
將變量 a 賦值為 2
定義一個整數(shù)變量 b,并且將變量 a 的值賦值給 b
變量 b 是第 2 個貼在數(shù)字 2 上的標(biāo)簽
在 Python 中,函數(shù)的 實(shí)參/返回值 都是是靠 引用 來傳遞來的
def test(num): print("-" * 50) print("%d 在函數(shù)內(nèi)的內(nèi)存地址是 %x" % (num, id(num))) result = 100 print("返回值 %d 在內(nèi)存中的地址是 %x" % (result, id(result))) print("-" * 50) return result a = 10 print("調(diào)用函數(shù)前 內(nèi)存地址是 %x" % id(a)) r = test(a) print("調(diào)用函數(shù)后 實(shí)參內(nèi)存地址是 %x" % id(a)) print("調(diào)用函數(shù)后 返回值內(nèi)存地址是 %x" % id(r))
不可變類型,內(nèi)存中的數(shù)據(jù)不允許被修改:
數(shù)字類型 int, bool, float, complex, long(2.x)
字符串 str
元組 tuple
可變類型,內(nèi)存中的數(shù)據(jù)可以被修改:
列表 list
字典 dict
a = 1 a = "hello" a = [1, 2, 3] a = [3, 2, 1]
demo_list = [1, 2, 3] print("定義列表后的內(nèi)存地址 %d" % id(demo_list)) demo_list.append(999) demo_list.pop(0) demo_list.remove(2) demo_list[0] = 10 print("修改數(shù)據(jù)后的內(nèi)存地址 %d" % id(demo_list)) demo_dict = {"name": "小明"} print("定義字典后的內(nèi)存地址 %d" % id(demo_dict)) demo_dict["age"] = 18 demo_dict.pop("name") demo_dict["name"] = "老王" print("修改數(shù)據(jù)后的內(nèi)存地址 %d" % id(demo_dict))
注意:字典的 key 只能使用不可變類型的數(shù)據(jù)
注意
可變類型的數(shù)據(jù)變化,是通過 方法 來實(shí)現(xiàn)的
如果給一個可變類型的變量,賦值了一個新的數(shù)據(jù),引用會修改
變量 不再 對之前的數(shù)據(jù)引用
變量 改為 對新賦值的數(shù)據(jù)引用
哈希 (hash)
Python 中內(nèi)置有一個名字叫做 hash(o) 的函數(shù)
接收一個 不可變類型 的數(shù)據(jù)作為 參數(shù)
返回 結(jié)果是一個 整數(shù)
哈希 是一種 算法,其作用就是提取數(shù)據(jù)的 特征碼(指紋)
相同的內(nèi)容 得到 相同的結(jié)果
不同的內(nèi)容 得到 不同的結(jié)果
在 Python 中,設(shè)置字典的 鍵值對 時,會首先對 key 進(jìn)行 hash 已決定如何在內(nèi)存中保存字典的數(shù)據(jù),以方便 后續(xù) 對字典的操作:增、刪、改、查
鍵值對的 key 必須是不可變類型數(shù)據(jù)
鍵值對的 value 可以是任意類型的數(shù)據(jù)
局部變量 是在 函數(shù)內(nèi)部 定義的變量,只能在函數(shù)內(nèi)部使用
全局變量 是在 函數(shù)外部定義 的變量(沒有定義在某一個函數(shù)內(nèi)),所有函數(shù) 內(nèi)部 都可以使用這個變量
提示:在其他的開發(fā)語言中,大多 不推薦使用全局變量 —— 可變范圍太大,導(dǎo)致程序不好維護(hù)!
局部變量 是在 函數(shù)內(nèi)部 定義的變量,只能在函數(shù)內(nèi)部使用
函數(shù)執(zhí)行結(jié)束后,函數(shù)內(nèi)部的局部變量,會被系統(tǒng)回收
不同的函數(shù),可以定義相同的名字的局部變量,但是 彼此之間 不會產(chǎn)生影響
局部變量的作用
在函數(shù)內(nèi)部使用,臨時 保存 函數(shù)內(nèi)部需要使用的數(shù)據(jù)
def demo1(): num = 10 print(num) num = 20 print("修改后 %d" % num) def demo2(): num = 100 print(num) demo1() demo2() print("over")
局部變量的生命周期
所謂 生命周期 就是變量從 被創(chuàng)建 到 被系統(tǒng)回收 的過程
局部變量 在 函數(shù)執(zhí)行時 才會被創(chuàng)建
函數(shù)執(zhí)行結(jié)束后 局部變量 被系統(tǒng)回收
局部變量在生命周期 內(nèi),可以用來存儲 函數(shù)內(nèi)部臨時使用到的數(shù)據(jù)
全局變量 是在 函數(shù)外部定義 的變量,所有函數(shù)內(nèi)部都可以使用這個變量
# 定義一個全局變量 num = 10 def demo1(): print(num) def demo2(): print(num) demo1() demo2() print("over")
注意:函數(shù)執(zhí)行時,需要處理變量時 會:
首先 查找 函數(shù)內(nèi)部 是否存在 指定名稱 的局部變量,如果有,直接使用
如果沒有,查找 函數(shù)外部 是否存在 指定名稱 的全局變量,如果有,直接使用
如果還沒有,程序報錯!
1) 函數(shù)不能直接修改 全局變量的引用
全局變量 是在 函數(shù)外部定義 的變量(沒有定義在某一個函數(shù)內(nèi)),所有函數(shù) 內(nèi)部 都可以使用這個變量
提示:在其他的開發(fā)語言中,大多 不推薦使用全局變量 —— 可變范圍太大,導(dǎo)致程序不好維護(hù)!
在函數(shù)內(nèi)部,可以 通過全局變量的引用獲取對應(yīng)的數(shù)據(jù)
但是,不允許直接修改全局變量的引用 —— 使用賦值語句修改全局變量的值
num = 10 def demo1(): print("demo1" + "-" * 50) # 只是定義了一個局部變量,不會修改到全局變量,只是變量名相同而已 num = 100 print(num) def demo2(): print("demo2" + "-" * 50) print(num) demo1() demo2() print("over")
注意:只是在函數(shù)內(nèi)部定義了一個局部變量而已,只是變量名相同 —— 在函數(shù)內(nèi)部不能直接修改全局變量的值
2) 在函數(shù)內(nèi)部修改全局變量的值
如果在函數(shù)中需要修改全局變量,需要使用 global 進(jìn)行聲明
num = 10 def demo1(): print("demo1" + "-" * 50) # global 關(guān)鍵字,告訴 Python 解釋器 num 是一個全局變量 global num # 只是定義了一個局部變量,不會修改到全局變量,只是變量名相同而已 num = 100 print(num) def demo2(): print("demo2" + "-" * 50) print(num) demo1() demo2() print("over")
3) 全局變量定義的位置
為了保證所有的函數(shù)都能夠正確使用到全局變量,應(yīng)該 將全局變量定義在其他函數(shù)的上方
a = 10 def demo(): print("%d" % a) print("%d" % b) print("%d" % c) b = 20 demo() c = 30
注意
由于全局變量 c,是在調(diào)用函數(shù)之后,才定義的,在執(zhí)行函數(shù)時,變量還沒有定義,所以程序會報錯!
代碼結(jié)構(gòu)示意圖如下
4) 全局變量命名的建議
為了避免局部變量和全局變量出現(xiàn)混淆,在定義全局變量時,有些公司會有一些開發(fā)要求,例如:
全局變量名前應(yīng)該增加 g_ 或者 gl_ 的前綴
1、簡單易用,與C/C++、Java、C# 等傳統(tǒng)語言相比,Python對代碼格式的要求沒有那么嚴(yán)格;2、Python屬于開源的,所有人都可以看到源代碼,并且可以被移植在許多平臺上使用;3、Python面向?qū)ο?,能夠支持面向過程編程,也支持面向?qū)ο缶幊蹋?、Python是一種解釋性語言,Python寫的程序不需要編譯成二進(jìn)制代碼,可以直接從源代碼運(yùn)行程序;5、Python功能強(qiáng)大,擁有的模塊眾多,基本能夠?qū)崿F(xiàn)所有的常見功能。
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。