變量與值的關系
值,了解為實體的資料
變量,了解為資料的稱呼
每一個值被創造出來,都會有一個記憶體id号碼。類似于人的身份證号碼。
指派操作
變量 = 值
a = "hello"
本質是
讓一個變量名稱指向數值的記憶體位址
我們後面使用變量時,對應記憶體位址的資料就會被使用
函數傳參的本質
![](/image/assets/1553236876775.png)
函數調用時,實參給形參傳值
實際上,本質傳的就是資料的引用(資料的記憶體id位址)
資料根據是否變化分兩類
可變類型
清單
字典
不可變類型
數字類型
字元串
元組
不可變類型
不可變類型
首次出現不可變類型的資料時
會先在記憶體中劃出一塊空間,存入不可變類型的資料實體,并且得到了一個記憶體的id
然後變量獲得這個記憶體id
第二次指派相同的值的時候,系統會發現記憶體中已經存在這個資料了。
由于該資料是不可變類型,特點就是,資料如果存在,不再建立新的記憶體空間。
如果第二次要用的話,直接使用這個資料的記憶體位址。
m = 12
n = 12
這兩個指派操作的過程
可變資料類型
總結兩類型的指派
不可變類型
a = 1
b = 1
的過程
首次出現不可變類型1的時候,會在記憶體中劃出一塊空間,儲存資料1
然後1同時會獲得一個記憶體id
變量a作為一個标記,标簽,會指向1的記憶體地真正
我們把這種指向叫做引用
第二次b=1
第二次出現資料的1的時候,會在記憶體中檢視,是否有它的存在,如果沒有這個資料1的存在,那麼會建立。
如果資料1存在了,那麼直接使用這個資料1的記憶體位址
同時變量b會指向資料1的記憶體位址
總的看來,變量a 與變量b 他們的資料記憶體位址是一緻
可變類型不同的地方就是
不論資料是否是首次出現
隻要存在資料的使用,都會是一個建立的過程,都會在記憶體中劃出一塊區域
可變類型的特點
通過自已的方法,修改資料(增删改查),自己的記憶體位址,不變
不可變類型不行
問題待解決
變量名 實際的資料
稱呼, 記憶體位址對應的那個資料
同桌,隻是一個标簽
m > id1, 指向的是id1的資料,通路m,拿到的就是id1的資料
m > id2,指向的是id2的資料,通路m, 拿到的就id2 的資料
哈希
hash(不可變類型)
數字,字元串,元組
變量的作用域
指的是變量的有效區域
局部變量
在函數中定義,在函數中使用
函數結束,局部變量銷亡
全局變量
在函數外,在主代碼區定義的變量
全局變量可以在函數中被使用
特别的情況
如果在函數内定義了一個與全局變量同名的變量
如果全局變量有num = 1
然後我們在函數内也定義了一個num=3的時候
再列印num 我們就是直接使用自己範圍内的,函數内的num
在函數内修改全局變量
使用關鍵詞
global
函數内部通過global關鍵詞,可以把全局變量引入進來
引入進來後,對它進行指派操作,就不再是生成局部變量了
而是
修改全局變量的值
global 全局變量名 # 引入全局變量到函數内部
全局變量名 = 數值 # 修改全局變量
小結
明确下面的過程到底經曆了哪些步驟
變量1 = 值1
變量2 = 值1
哪些資料類型是可變類型
- 清單
- 字典
特點,他們自身有技能(改變自己的技能,增删改查)
函數的傳參
- 本質就是傳送資料的引用
哪些類據類型是不可變類型
- 數字型
- 字元串
- 元組
特點,他們自身沒有修改自己的技能
可變類型的特點
- 被定義時,不論是否有相同的資料,直接在記憶體中劃塊空間存值
- 可以在不改變記憶體位址的情況下,改變自身内部的資料内容
- 隻有通過自己的技能(方法)才可以做到不改變記憶體位址改變資料的實作
不可變類型的特點
- 被定義時,先檢視記憶體中是否有相同的資料存在,如果有就直接使用,如果沒有就劃一塊記憶體存資料
- 無法在記憶體位址不變的情況下修改資料
哈希
- 哈希函數 hash(不可變類型)
- 同樣的資料生成同樣的哈希值
- 不同的資料生成不同的資料值
- 指紋的用途,用于識别兩個資料是否一緻
局部變量
定義在函數内部的變量
進入函數後才存活,函數結束就銷亡
全局變量
定義在函數外部的變量
可以被函數使用
函數内部要修改全局變量,可通過global關鍵詞先導入進來,然後通過指派語句來修改
局部變量的命名
以g_ 或者 gl_開頭
寫代碼的堆放位置
shebang
導入子產品
全局變量
函數定義
執行的代碼