Python中的變量、地址、id、is與==


Python中的變量、地址、id、is與==

Python一定程度上代表著計算機技術發展的方向,所以有閒情逸致還是可以學習一番

一、簡介

本篇主要介紹Python作為一種動態語言的動態特點、Python的變量保存、以及id()函數和is()函數和==操作符之間愛恨糾纏的關係。

二、動態語言

首先所謂的動態語言、靜態語言,其實就是針對變量的類型而言的。

靜態語言比較常見的如Java和C#,你在定義變量的時候就得說好了它是啥類型如:

<code>int num;//定義一個整型變量num,int的意思是整數類型/<code>

動態語言就不必,為啥不必呢,因為無所謂啊。動態語言的變量可以隨時改變類型哦,比如:

<code>a=1#此時a是一個整數類型

a=0.1#變成了浮點數類型

a="Hello"#又變成了字符串類型/<code>

OK,那麼好像看起來,動態語言更靈活,更牛逼一點。是的,是更靈活,但是既然要到運行的時候才能確定怎麼存儲、使用這些變量,肯定會在某些方面(比如性能)上有弱點吧,金無赤足,各有所長嘛。

三、Python變量的保存

那麼看似牛X的Python變量是如何可以切換類型的呢,其實真正牛的不是Python變量,而是Python語言的解釋執行器。

舉個例子如下,解釋器可以這麼運作。首先在內存中地址為xxxx的地方存了一個變量1,然後運行到a=1時,發現整數1要賦值給變量a,所以解釋器就知道了啊哈變量a是整型,然後a其實保存的是地址xxxx。

然後運行到a=0.1,解釋執行器在內存中地址為yyyy的地方存了0.1,然後知道了啊哈a是浮點類型,然後a保存的地址變為了yyyy。

<code>a=1# 保存的是1在內存中位置的引用
a=0.1#保存的改成了0.1在內存中位置的引用/<code>

既然解釋器每次在保存變量值(指向地址)時,都要識別值的類型並關聯到變量,所以效率肯定會低一點吧。(如果解釋執行器是這麼運作的話,Python可是有不止一種解釋執行器,所以也得看開發解釋執行器的人的設計啦)。

四、id() is() 與 ==

id()函數非常好理解,就是求變量地址,例子如下,注意同樣是值1,可能對應的地址是不同的,因為在內存為1分配地址時分配了不同地址。

<code>a=1#定義變量a
print(id(a))#輸出3543160/<code>

瞭解了id(),那麼is()和==的區別就好理解了。==就是看值相等不,相等就返回True。而is()就是看id相等不,相等就返回True。

舉個例子:

<code>a=1
b=1.0
a==b#True,值就是相等哦
a is b#False,地址肯定不一樣
c=1
a is c#True,這個應該看解釋器了,如果解釋器為常量1分配一樣的地址就相等了,也有可能解釋器特殊喜歡分配不同地址。/<code>


分享到:


相關文章: