代碼塊:python
Python程序是由代碼塊構造的。塊是緩存
一個python程序的文本,他是做爲一個單元執行的。函數
代碼塊:一個模塊,一個函數,一個類,一個文件等都是一個代碼塊。性能
而做爲交互方式輸入的每一個命令都是一個代碼塊。優化
什麼叫交互方式?就是我們在cmd中進入Python解釋器裏面,每一行代碼都是一個代碼塊,spa
id,is,==對象
== 是比較的兩邊的數值是否相等,而 is 是比較的兩邊的內存地址是否相等。 若是內存地址相等,那麼這兩邊實際上是指向同一個內存地址。blog
能夠說若是內存地址相同,那麼值確定相同,可是若是值相同,內存地址不必定相同。內存
3、小數據池字符串
小數據池,也稱爲小整數緩存機制,或者稱爲駐留機制等等
大前提:小數據池,只針對,整數,字符串,bool值。
Python自動將-5~256的整數進行了緩存,當你將這些整數賦值給變量時,並不會從新建立對象,而是使用已經建立好的緩存對象。
python會將必定規則的字符串在字符串駐留池中,建立一份,當你將這些字符串賦值給變量時,並不會從新建立對象, 而是使用在字符串駐留池中建立好的對象。
其實,不管是緩存仍是字符串駐留池,都是python作的一個優化,就是將~5-256的整數,和必定規則的字符串,放在一個‘池’(容器,或者字典)中,不管程序中那些變量指向這些範圍內的整數或者字符串,那麼他直接在這個‘池’中引用,言外之意,就是內存中之建立一個。
優勢:可以提升一些字符串,整數處理人物在時間和空間上的性能;須要值相同的字符串,整數的時候,直接從‘池’裏拿來用,避免頻繁的建立和銷燬,提高效率,節約內存。
缺點:在‘池’中建立或插入字符串,整數時,會花費更多的時間。
int:那麼你們都知道對於整數來講,小數據池的範圍是-5~256 ,若是多個變量都是指向同一個(在這個範圍內的)數字,他們在內存中指向的都是一個內存地址。
str:字符串要從下面這幾個大方向討論:
1,字符串的長度爲0或者1,默認都採用了駐留機制(小數據池)。
2,字符串的長度>1,且只含有大小寫字母,數字,下劃線時,纔會默認駐留。
3,用乘法獲得的字符串,分兩種狀況。
3.1 乘數爲1時:
僅含大小寫字母,數字,下劃線,默認駐留。
含其餘字符,長度<=1,默認駐留。
含其餘字符,長度>1,默認駐留。
3.2 乘數>=2時:
僅含大小寫字母,數字,下劃線,總長度<=20,默認駐留。
4,指定駐留。
from sys import intern a = intern('hello!@'*20) b = intern('hello!@'*20) print(a is b) #指定駐留是你能夠指定任意的字符串加入到小數據池中,讓其只在內存中建立一個對象,多個變量都是指向這一個字符串。
bool值就是True,False,不管你建立多少個變量指向True,False,那麼他在內存中只存在一個。
總結:
Python在執行同一個代碼塊的初始化對象的命令時,會檢查是否其值是否已經存在,若是存在,會將其重用。換句話說:執行同一個代碼塊時,遇到初始化對象的命令時,他會將初始化的這個變量與值存儲在一個字典中,在遇到新的變量時,會先在字典中查詢記錄,若是有一樣的記錄那麼它會重複使用這個字典中的以前的這個值。因此在你給出的例子中,文件執行時(同一個代碼塊)會把i一、i2兩個變量指向同一個對象。
若是是不一樣的代碼塊,他就會看這個兩個變量是不是知足小數據池的數據,若是是知足小數據池的數據則會指向同一個地址。