### 一、基本原理
Python中一切都是對象,變量是對象的引用。這是一個普遍的法則。我們舉個例子來說,Python是如何來處理的。
~~~
x = 'blue'
y = 'green'
z = x
~~~
當python執行上面第一句的時候,會在heap中首先創建一個str對象,其文本內容為blue,同時還創建一個名為x的對象引用,x引用的就是這個str對象。第二句也是類似;第三條創建了一個名為z的新對象引用,并將其設置為對象引用x所指向的相同對象。如下圖的變化。

所以看出在Python中賦值操作符號“=”的作用是,將對象引用和內存中的某個對象進行綁定。如果對象已經存在,就進行簡單的重新綁定,以便引用“=”右邊的對象;如果對象引用尚未存在,就首先創建對象,然后將對象引用和對象進行綁定。
Python使用“動態類型”機制,也就是說,在Python程序中,任何時候可以根據需要,某個對象引用都可以重新綁定到另一個不同的對象上(不要求是相同的類型),這和其他強化型語言如(C++,Java)不太一樣,只允許重新綁定相同類型的對象上。在Python中,因為有“動態類型”機制,所以一個對象引用可以執行不同類型的對象適用的方法。當一個對象不存在任何對象引用的時候,就進入了垃圾收集的過程。
查看類型程序:
~~~
import types
type(100)
~~~
~~~
>>> a=100
>>> a/10
10
>>> a[0]
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
a[0]
TypeError: 'int' object has no attribute '__getitem__'
>>> a='hello'
>>> a[0]
'h'
>>> a/10
Traceback (most recent call last):
File "<pyshell#8>", line 1, in <module>
a/10
TypeError: unsupported operand type(s) for /: 'str' and 'int'
>>>
~~~
第一句 a = 100?
Python會在heap創建一個int對象,其內容為100,同時創建a變量,其值指向heap中的int對象

第二句 a/10
Python適用“動態類型”機制,判斷a指向的對象是int型,可以適用/(除法)操作。于是便進行運算產生結果。(它會在heap中在創建一個10.0的對象么?)
第三句 a[0]
Python適用“動態類型”機制,判斷a指向的對象是int型,并不適用[](分片)操作。于是就進行報錯。
第四句 a = 'hello'
Python會在heap創建一個str對象,其內容為hello,同時改變a變量,使得其值指向heap中的str對象。同時原來的int對象,由于不在存在對象引用,所以就進入了垃圾收集過程。

第五句 a[0]
Python適用“動態類型”機制,判斷a指向的對象是str型,可以適用[](分片)操作。于是便進行運算產生結果。
第六句 a/10
Python適用“動態類型”機制,判斷a指向的對象是str型,并不適用/(除法)操作。于是就進行報錯。
**總之**:在Python中一切都是對象,變量總是存放對象引用。當一個對象沒有變量指向它的時候,它便進入了垃圾收集過程。Python的“動態類型”機制,負責檢查變量的對象引用適用操作。如果該對象不適用該操作,則會直接報錯。一句話”**變量無類型,對象有類型**“
### 二、python的id(),==,is的差別
1. id():獲取的是對象在內存中的地址
2. is :比對2個變量的**對象引用**(對象在內存中的地址,即id() 獲得的值)**是否相同**。如果相同則返回True,否則返回False。換句話說,就是比對2個變量的對象引用是否指向同一個對象。
3. ==:比對2個變量指向的對象的內容是否相同。