18/5/4 小數據池,編碼的進階
一、內存地址(id):
變量:將計算的中間結果儲存起來,以便後續代碼使用
問題來了:變量存在哪裏呢,或許可以這樣問:變量儲存在內存哪裏呢?
內存會進行分區,每個分區都有一個序號,而每個分區裏面都儲存著數據,變量就來自這裏,而分區的序號就叫內存地址
python 這門語言不像 C 語言,C 語言是屬於內存級別的語言,C 涉及到指針,內存。而 python 不同,它的內存級別的已經設計好了。所以 python 比 C 簡單,也正是如此,雖然 python 也有內存地址這個概念,但是它的內存地址和真實的內存地址是不一樣的,只是 python 解釋器虛擬的一個地址
name = ‘alex‘ print(id(name)) #查詢‘alex’的內存地址 2471424258264 name = ‘alex‘ print(id(name)) #再次查詢 1648814026968 #id出現變化
一個等號 “=” 代表賦值,兩個等號 “==” 代表比較是否相等
is 內存地址是否相同 【驗證內存地址是否相等不能在pycharm中進行,必須在終端驗證】
因為第一個是 True 所以 i 和 i1 在內存中用的是同一個值,第二個是 False 所以 i 和 i1 在內存中用的是兩個值 這就引出來小數據池的概念
二、小數據池 :
只存在於 int(整數) str(字符串)當中,在一定範圍內,如果兩個數值相同:為了節省內存,共用一個內存地址。
int的範圍: -5 ~256
str的限制條件【不知道全不全】:
1.單個字母元素*個數(不能超過21)存在小數據池
2.自己設置的字符串(只包含數字字母),不管多大,都存在小數據池
三、編碼的進階
1.不同的密碼本之間的二進制是不能全互相識別的,容易報錯或者產生亂碼
#gbk utf-8 #對於字母,數字,特殊符號的編碼都是引用 ascii 碼,所以可以直接轉化。補充:字母數字特殊字符,可以互相轉換s1 = ‘123asd*&^‘ b1 = s1.encode(‘utf-8‘) # 轉化為 utf-8 的字節 s2 = b1.decode(‘gbk‘) #直接轉化 gbk 的字符串 print(s2) 123asd*&^
2.計算機的文件存儲和傳輸都是二進制 010101 (gbk , utf-8 , ascii , gb2312) 不能是unicode(萬國碼,造成資源浪費)
大前提:python3x ,編碼
數據類型:
int
str
bytes (字節) : str 擁有的所有方法,bytes都有
bool
list
tupule (元組)
dict (字典)
set (集合)
str ; python3x 內存中的(字符串)編碼方式是 Unicode (規定)
英文:
str:表現形式 name = ‘alex‘
內部編碼: unicode
name = ‘alex‘ print(name,type(name)) alex <class ‘str‘>
bytes:表現形式: name1 = b‘alex‘
內部編碼:非unicode
name1 = b‘alex‘ print(name1,type(name1)) b‘alex‘ <class ‘bytes‘>
中文:
str:表現形式: name = “中國”
內部編碼: Unicode
name1 = ‘中國‘ print(name1,type(name1)) 中國 <class ‘str‘>
bytes:表現形式:b‘\xe4\xb8\xad\xe5\x9b\xbd‘
內部編碼:非Unicode
name = ‘中國‘.encode(‘utf-8‘) print(name,type(name)) b‘\xe4\xb8\xad\xe5\x9b\xbd‘ <class ‘bytes‘> #\xe4 : 一個字節
四、str ---> bytes 轉化 ‘字符串‘.encode(編碼方式) # encode 編碼
bytes--->str 轉化 字節.decode(編碼方式) # decode 解碼
# 編碼方式必須相同,否則會產生亂碼或報錯
name = ‘中國‘.encode(‘utf-8‘) print(name,type(name)) name1 = name.decode(‘gbk‘) print(name1,type(name1)) b‘\xe4\xb8\xad\xe5\x9b\xbd‘ <class ‘bytes‘> UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xad in position 2: illegal multibyte sequence #報錯
18/5/4 小數據池,編碼的進階