內存:速度快,臨時存放 硬盤:速度慢,永久保存node
打開編輯器就能夠啓動一個進程,是在內存中的,因此在編輯器編寫的內容也都是存放在內存中的,斷電後數據就丟失了。於是須要保存在硬盤上,點擊保存按鈕或快捷鍵,就把內存中的數據保存到了硬盤上。在這一點上,咱們編寫的py文件(沒有執行時),跟編寫的其餘文件沒有什麼區別,都只是編寫一堆字符而已。python
第一階段: python解釋器啓動,此時就至關於啓動了一個文本編輯器 第二階段: python解釋器至關於文本編輯器,去打開test.py,從硬盤上將test.py的文件內容讀入到內存中 第三階段: python解釋器執行剛剛加載到內存中的test.py的代碼(在該階段,即執行時,纔會識別python的語法,執行到字符串時,會開闢內存空間存放字符串) 總結: python解釋器與文本編輯器的異同 相同點: python解釋器是解釋執行文件內容的,於是python解釋器具有讀py文件的功能,這一點與文本編輯器同樣 不一樣點: 文本編輯器將文件內容讀入內存後,是爲了顯示/編輯,而python解釋器將文件內容讀入內存後,是爲了執行(識別python的語法)bash
計算機想要工做必須通電,高低電平(高電平即二進制數1,低電平即二進制數0),也就是說計算機只認識數字。那麼讓計算機如何讀懂人類的字符呢? 這就必須通過一個過程: 字符---------(翻譯過程)-------------數字 這個過程實際就是一個字符如何對應一個特定數字的標準,這個標準稱之爲字符編碼。網絡
1.一個python文件中的內容是由一堆字符組成的(python文件未執行時) 2.python中的數據類型字符串是由一串字符組成的(python文件執行時)編輯器
階段一:現代計算機起源於美國,最先誕生也是基於英文考慮的ASCII ASCII:一個Bytes表明一個字符(英文字符/鍵盤上的全部其餘字符),1Bytes=8bit,8bit能夠表示0-2**8-1種變化,便可以表示256個字符 ASCII最初只用了後七位,127個數字,已經徹底可以表明鍵盤上全部的字符了(英文字符/鍵盤的全部其餘字符) 後來爲了將拉丁文也編碼進了ASCII表,將最高位也佔用了 階段二:爲了知足中文,中國人定製了GBK GBK:2Bytes表明一個字符,爲了知足其餘國家,各個國家紛紛定製了本身的編碼,日本把日文編到Shift_JIS裏,韓國把韓文編到Euc-kr裏 階段三:各國有各國的標準,就會不可避免地出現衝突,結果就是,在多語言混合的文本中,顯示出來會有亂碼。 因而產生了unicode, 統一用2Bytes表明一個字符, 2**16-1=65535,可表明6萬多個字符,於是兼容萬國語言 但對於通篇都是英文的文原本說,這種編碼方式無疑是多了一倍的存儲空間(二進制最終都是以電或者磁的方式存儲到存儲介質中的) 因而產生了UTF-8,對英文字符只用1Bytes表示,對中文字符用3Bytes ==須要強調的是:== ==unicode:== 簡單粗暴,多有的字符都是2Bytes,優勢是字符--數字的轉換速度快;缺點是佔用空間大。 ==utf-8:== 精準,可變長,優勢是節省空間;缺點是轉換速度慢,由於每次轉換都須要計算出須要多長Bytes纔可以準確表示。ui
unicode------>encode(編碼)-------->utf-8 utf-8---------->decode--------->unicode 編碼
文件從內存刷到硬盤的操做簡稱存文件 文件從硬盤讀到內存的操做簡稱讀文件 亂碼:存文件時就已經亂碼 或者 存文件時不亂碼而讀文件時亂碼 總結: 不管是何種編輯器,要防止文件出現亂碼(請必定注意,存放一段代碼的文件也僅僅只是一個普通文件而已,此處指的是文件沒有執行前,咱們打開文件時出現的亂碼) 核心法則就是,文件以什麼編碼保存的,就以什麼編碼方式打開文件test.py以gbk格式保存,內容爲: x='林' 不管是 python2 test.py 仍是 python3 test.py 都會報錯(由於python2默認ascii,python3默認utf-8) 除非在文件開頭指定#coding:gbkspa
python3 test.py 或 python2 test.py(執行test.py的第一步,必定是先將文件內容讀入到內存中) 階段一:啓動python解釋器 階段二:python解釋器此時就是一個文本編輯器,負責打開文件test.py,即從硬盤中讀取test.py的內容到內存中 此時,python解釋器會讀取 test.py 的第一行內容,#coding :utf-8,來決定以什麼編碼格式來讀入內存,這一行就是來設定python解釋器這個軟件的編碼使用的編碼格式這個編碼,python2默認使用ASCII,python3中默認使用utf-8 階段三:讀取已經加載到內存的代碼(unicode編碼的二進制),而後執行,執行過程當中可能會開闢新的內存空間,好比x="egon" 內存的編碼使用unicode,不表明內存中全都是unicode編碼的二進制, 在程序執行以前,內存中確實都是unicode編碼的二進制,好比從文件中讀取了一行x="egon",其中的x,等號,引號,地位都同樣,都是普通字符而已,都是以unicode編碼的二進制形式存放與內存中的 可是程序在執行過程當中,會申請內存(與程序代碼所存在的內存是倆個空間),能夠存聽任意編碼格式的數據,好比x="egon",會被python解釋器識別爲字符串,會申請內存空間來存放"hello",而後讓x指向該內存地址,此時新申請的該內存地址保存也是unicode編碼的egon,若是代碼換成x="egon".encode('utf-8'),那麼新申請的內存空間裏存放的就是utf-8編碼的字符串egon了翻譯
在python2中有兩種字符串類型str和unicode 在python2中,str就是編碼後的結果bytes,因此在Python2中,unicode字符編碼的結果就是str/bytes3d
#coding:utf-8
s='林' #在執行時,'林'會被以conding:utf-8的形式保存到新的內存空間中
print repr(s) #'\xe6\x9e\x97' 三個Bytes,證實確實是utf-8
print type(s) #<type 'str'>
s.decode('utf-8')
## s.encode('utf-8') #報錯,s爲編碼後的結果bytes,因此只能decode
複製代碼
當python解釋器執行到產生字符串的代碼時(例如s=u'林'),會申請新的內存地址,而後將'林'以unicode的格式存放到新的內存空間中,因此s只能encode,不能decode
s=u'林'
print repr(s) #u'\u6797'
print type(s) #<type 'unicode'>
## s.decode('utf-8') #報錯,s爲unicode,因此只能encode
s.encode('utf-8')
複製代碼