python变量进阶(可变不可变,局部变量和全局变量)
變量進階(理解)
目標
- 變量的引用
- 可變和不可變類型
- 局部變量和全局變量
01. 變量的引用
- 變量 和 數(shù)據(jù) 都是保存在?內(nèi)存?中的
- 在?Python?中?函數(shù) 的 參數(shù)傳遞?以及?返回值?都是靠?引用?傳遞的
1.1 引用的概念
在?Python?中
- 變量?和?數(shù)據(jù)?是分開存儲的
- 數(shù)據(jù)?保存在內(nèi)存中的一個位置
- 變量?中保存著數(shù)據(jù)在內(nèi)存中的地址
- 變量?中?記錄數(shù)據(jù)的地址,就叫做?引用
- 使用?id()?函數(shù)可以查看變量中保存數(shù)據(jù)所在的?內(nèi)存地址
注意:如果變量已經(jīng)被定義,當給一個變量賦值的時候,本質(zhì)上是?修改了數(shù)據(jù)的引用
- 變量?不再?對之前的數(shù)據(jù)引用
- 變量?改為?對新賦值的數(shù)據(jù)引用
1.2?變量引用?的示例
在?Python?中,變量的名字類似于?便簽紙?貼在?數(shù)據(jù)?上
- 定義一個整數(shù)變量?a,并且賦值為?1
| a = 1 |  |
- 將變量?a?賦值為?2
| a = 2 |  |
- 定義一個整數(shù)變量?b,并且將變量?a?的值賦值給?b
| b = a |  |
變量?b?是第 2 個貼在數(shù)字?2?上的標簽
1.3 函數(shù)的參數(shù)和返回值的傳遞
在?Python?中,函數(shù)的?實參/返回值?都是是靠?引用?來傳遞來的
def test(num):print("-" * 50)print("%d 在函數(shù)內(nèi)的內(nèi)存地址是 %x" % (num, id(num)))result = 100print("返回值 %d 在內(nèi)存中的地址是 %x" % (result, id(result)))print("-" * 50)return resulta = 10 print("調(diào)用函數(shù)前 內(nèi)存地址是 %x" % id(a))r = test(a)print("調(diào)用函數(shù)后 實參內(nèi)存地址是 %x" % id(a)) print("調(diào)用函數(shù)后 返回值內(nèi)存地址是 %x" % id(r))02. 可變和不可變類型
-
不可變類型,內(nèi)存中的數(shù)據(jù)不允許被修改:
- 數(shù)字類型?int,?bool,?float,?complex,?long(2.x)
- 字符串?str
- 元組?tuple
-
可變類型,內(nèi)存中的數(shù)據(jù)可以被修改:
- 列表?list
- 字典?dict
注意:字典的?key?只能使用不可變類型的數(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?中,設置字典的?鍵值對?時,會首先對?key?進行?hash?已決定如何在內(nèi)存中保存字典的數(shù)據(jù),以方便?后續(xù)?對字典的操作:增、刪、改、查
- 鍵值對的?key?必須是不可變類型數(shù)據(jù)
- 鍵值對的?value?可以是任意類型的數(shù)據(jù)
03. 局部變量和全局變量
- 局部變量?是在?函數(shù)內(nèi)部?定義的變量,只能在函數(shù)內(nèi)部使用
- 全局變量?是在?函數(shù)外部定義?的變量(沒有定義在某一個函數(shù)內(nèi)),所有函數(shù)?內(nèi)部?都可以使用這個變量
提示:在其他的開發(fā)語言中,大多?不推薦使用全局變量?—— 可變范圍太大,導致程序不好維護!
3.1 局部變量
- 局部變量?是在?函數(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ù)
局部變量的生命周期
- 所謂?生命周期?就是變量從?被創(chuàng)建?到?被系統(tǒng)回收?的過程
- 局部變量?在?函數(shù)執(zhí)行時?才會被創(chuàng)建
- 函數(shù)執(zhí)行結(jié)束后?局部變量?被系統(tǒng)回收
- 局部變量在生命周期?內(nèi),可以用來存儲?函數(shù)內(nèi)部臨時使用到的數(shù)據(jù)
3.2 全局變量
- 全局變量?是在?函數(shù)外部定義?的變量,所有函數(shù)內(nèi)部都可以使用這個變量
注意:函數(shù)執(zhí)行時,需要處理變量時?會:
1) 函數(shù)不能直接修改?全局變量的引用
- 全局變量?是在?函數(shù)外部定義?的變量(沒有定義在某一個函數(shù)內(nèi)),所有函數(shù)?內(nèi)部?都可以使用這個變量
提示:在其他的開發(fā)語言中,大多?不推薦使用全局變量?—— 可變范圍太大,導致程序不好維護!
- 在函數(shù)內(nèi)部,可以?通過全局變量的引用獲取對應的數(shù)據(jù)
- 但是,不允許直接修改全局變量的引用?—— 使用賦值語句修改全局變量的值
注意:只是在函數(shù)內(nèi)部定義了一個局部變量而已,只是變量名相同 —— 在函數(shù)內(nèi)部不能直接修改全局變量的值
2) 在函數(shù)內(nèi)部修改全局變量的值
- 如果在函數(shù)中需要修改全局變量,需要使用?global?進行聲明
3) 全局變量定義的位置
- 為了保證所有的函數(shù)都能夠正確使用到全局變量,應該?將全局變量定義在其他函數(shù)的上方
注意
- 由于全局變量 c,是在調(diào)用函數(shù)之后,才定義的,在執(zhí)行函數(shù)時,變量還沒有定義,所以程序會報錯!
代碼結(jié)構(gòu)示意圖如下

4) 全局變量命名的建議
- 為了避免局部變量和全局變量出現(xiàn)混淆,在定義全局變量時,有些公司會有一些開發(fā)要求,例如:
- 全局變量名前應該增加?g_?或者?gl_?的前綴
提示:具體的要求格式,各公司要求可能會有些差異
轉(zhuǎn)載于:https://www.cnblogs.com/xiangribai/p/8594348.html
總結(jié)
以上是生活随笔為你收集整理的python变量进阶(可变不可变,局部变量和全局变量)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 牛客练习赛13
- 下一篇: Python第00次作业