python3入门与进阶笔记_16_变量进阶 — 黑马程序员《Python入门教程完整版》笔记...
變量進階(理解)
— 黑馬程序員《Python入門教程完整版》筆記
目標變量的引用
可變和不可變類型
局部變量和全局變量
01. 變量的引用變量 和 數據 都是保存在 內存 中的
在 Python 中 函數 的 參數傳遞 以及 返回值 都是靠 引用 傳遞的
1.1 引用的概念
在 Python 中變量 和 數據 是分開存儲的
數據 保存在內存中的一個位置
變量 中保存著數據在內存中的地址
變量 中 記錄數據的地址,就叫做 引用
使用 id() 函數可以查看變量中保存數據所在的 內存地址注意:如果變量已經被定義,當給一個變量賦值的時候,本質上是 修改了數據的引用變量 不再 對之前的數據引用
變量 改為 對新賦值的數據引用
1.2 變量引用 的示例
在 Python 中,變量的名字類似于 便簽紙 貼在 數據 上定義一個整數變量 a,并且賦值為 1代碼圖示a = 1將變量 a 賦值為 2代碼圖示a = 2定義一個整數變量 b,并且將變量 a 的值賦值給 b代碼圖示b = a變量 b 是第 2 個貼在數字 2 上的標簽
1.3 函數的參數和返回值的傳遞
在 Python 中,函數的 實參/返回值 都是是靠 引用 來傳遞來的def test(num):
print("-" * 50)
print("%d 在函數內的內存地址是 %x" % (num, id(num)))
result = 100
print("返回值 %d 在內存中的地址是 %x" % (result, id(result)))
print("-" * 50)
return result
a = 10
print("調用函數前 內存地址是 %x" % id(a))
r = test(a)
print("調用函數后 實參內存地址是 %x" % id(a))
print("調用函數后 返回值內存地址是 %x" % id(r))
02. 可變和不可變類型不可變類型,內存中的數據不允許被修改:數字類型 int, bool, float, complex, long(2.x)
字符串 str
元組 tuple
可變類型,內存中的數據可以被修改:列表 list
字典 dicta = 1
a = "hello"
a = [1, 2, 3]
a = [3, 2, 1]demo_list = [1, 2, 3]
print("定義列表后的內存地址 %d" % id(demo_list))
demo_list.append(999)
demo_list.pop(0)
demo_list.remove(2)
demo_list[0] = 10
print("修改數據后的內存地址 %d" % id(demo_list))
demo_dict = {"name": "小明"}
print("定義字典后的內存地址 %d" % id(demo_dict))
demo_dict["age"] = 18
demo_dict.pop("name")
demo_dict["name"] = "老王"
print("修改數據后的內存地址 %d" % id(demo_dict))注意:字典的 key 只能使用不可變類型的數據
注意可變類型的數據變化,是通過 方法 來實現的
如果給一個可變類型的變量,賦值了一個新的數據,引用會修改變量 不再 對之前的數據引用
變量 改為 對新賦值的數據引用
哈希 (hash)Python 中內置有一個名字叫做 hash(o) 的函數接收一個 不可變類型 的數據作為 參數
返回 結果是一個 整數
哈希 是一種 算法,其作用就是提取數據的 特征碼(指紋)相同的內容 得到 相同的結果
不同的內容 得到 不同的結果
在 Python 中,設置字典的 鍵值對 時,會首先對 key 進行 hash 已決定如何在內存中保存字典的數據,以方便 后續 對字典的操作:增、刪、改、查鍵值對的 key 必須是不可變類型數據
鍵值對的 value 可以是任意類型的數據
03. 局部變量和全局變量局部變量 是在 函數內部 定義的變量,只能在函數內部使用
全局變量 是在 函數外部定義 的變量(沒有定義在某一個函數內),所有函數 內部 都可以使用這個變量提示:在其他的開發語言中,大多 不推薦使用全局變量 —— 可變范圍太大,導致程序不好維護!
3.1 局部變量局部變量 是在 函數內部 定義的變量,只能在函數內部使用
函數執行結束后,函數內部的局部變量,會被系統回收
不同的函數,可以定義相同的名字的局部變量,但是 彼此之間 不會產生影響
局部變量的作用在函數內部使用,臨時 保存 函數內部需要使用的數據def demo1():
num = 10
print(num)
num = 20
print("修改后 %d" % num)
def demo2():
num = 100
print(num)
demo1()
demo2()
print("over")
局部變量的生命周期所謂 生命周期 就是變量從 被創建 到 被系統回收 的過程
局部變量 在 函數執行時 才會被創建
函數執行結束后 局部變量 被系統回收
局部變量在生命周期 內,可以用來存儲 函數內部臨時使用到的數據
3.2 全局變量全局變量 是在 函數外部定義 的變量,所有函數內部都可以使用這個變量# 定義一個全局變量
num = 10
def demo1():
print(num)
def demo2():
print(num)
demo1()
demo2()
print("over")
注意:函數執行時,需要處理變量時 會:首先 查找 函數內部 是否存在 指定名稱 的局部變量,如果有,直接使用
如果沒有,查找 函數外部 是否存在 指定名稱 的全局變量,如果有,直接使用
如果還沒有,程序報錯!
1) 函數不能直接修改 全局變量的引用全局變量 是在 函數外部定義 的變量(沒有定義在某一個函數內),所有函數 內部 都可以使用這個變量提示:在其他的開發語言中,大多 不推薦使用全局變量 —— 可變范圍太大,導致程序不好維護!在函數內部,可以 通過全局變量的引用獲取對應的數據
但是,不允許直接修改全局變量的引用 —— 使用賦值語句修改全局變量的值num = 10
def demo1():
print("demo1" + "-" * 50)
# 只是定義了一個局部變量,不會修改到全局變量,只是變量名相同而已
num = 100
print(num)
def demo2():
print("demo2" + "-" * 50)
print(num)
demo1()
demo2()
print("over")注意:只是在函數內部定義了一個局部變量而已,只是變量名相同 —— 在函數內部不能直接修改全局變量的值
2) 在函數內部修改全局變量的值如果在函數中需要修改全局變量,需要使用 global 進行聲明num = 10
def demo1():
print("demo1" + "-" * 50)
# global 關鍵字,告訴 Python 解釋器 num 是一個全局變量
global num
# 只是定義了一個局部變量,不會修改到全局變量,只是變量名相同而已
num = 100
print(num)
def demo2():
print("demo2" + "-" * 50)
print(num)
demo1()
demo2()
print("over")
3) 全局變量定義的位置為了保證所有的函數都能夠正確使用到全局變量,應該 將全局變量定義在其他函數的上方a = 10
def demo():
print("%d" % a)
print("%d" % b)
print("%d" % c)
b = 20
demo()
c = 30
注意由于全局變量 c,是在調用函數之后,才定義的,在執行函數時,變量還沒有定義,所以程序會報錯!
代碼結構示意圖如下
4) 全局變量命名的建議為了避免局部變量和全局變量出現混淆,在定義全局變量時,有些公司會有一些開發要求,例如:
全局變量名前應該增加 g_ 或者 gl_ 的前綴提示:具體的要求格式,各公司要求可能會有些差異
總結
以上是生活随笔為你收集整理的python3入门与进阶笔记_16_变量进阶 — 黑马程序员《Python入门教程完整版》笔记...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用python画图表_利用Python
- 下一篇: python打开excel执行vba代码