1. 程式人生 > >python----基礎之變量的創建與id

python----基礎之變量的創建與id

this 介紹 enc code dbo 過程 代碼 .com 一件事

變量的創建與id

例1:name = ‘oldboy‘

首先,當我們定義了一個變量name = ‘oldboy’的時候,在內存中其實是做了這樣一件事:

程序開辟了一塊內存空間,將‘oldboy’存儲進去,再讓變量名name指向‘oldboy’所在的內存地址。如下圖所示:

技術分享圖片

例2:兩個變量名一個值

當我們執行下面這段代碼的時候,程序是怎麽處理的呢?

name1 = oldboy
name2 = oldboy‘

我們猜想會有兩種可能:

第一種情況:程序分別在內存中開辟了兩塊兒空間來存儲‘oldboy’這個值,並且讓name1和name2指向這兩個值。如下左圖

第二種情況:由於兩個值內容一致,所以程序只開辟一塊兒空間存儲‘oldboy’,並讓name1和name2只想著個值。如下右圖

技術分享圖片

其實上面的兩種猜想都是對的。正常情況下字符串在內存裏就是如我們猜想的第一種情況一樣,每一次創建一個變量都會在內存中申請一塊兒空間。

但是,python認為一些“看起來像python標識符的字符”和小整數字在開發中是常用的,因此出於節省內存的角度思考,對於這部分字符串和數字做出了優化[-5,257),python解釋器會由於要定義的新變量內容與之前定義過的變量內容相同而不讓這部分內容占用新的內存空間。

我們如何證明我們的想法呢?

python為我們提供了一個id()方法,可以查看一個變量的內存地址。

>>> name1 = oldboy
>>> name2 = oldboy
>>> print(id(name1))
35536192
>>> print(id(name2))
35536192

執行完這段代碼就基本驗證了我們的思想,由於‘oldboy’是一個簡單的字符串,因此python解釋器做了優化,內存裏只有一個‘oldboy’,name1和name2都指向同一塊兒內存地址。

如果是長字符串呢?就米有優化機制啦!

>>> a = this is a very long sentence
>>> b = this is a very long sentence
>>> id(a)
34801104
>>> id(b)
34801608

對於[-5,257)範圍內的數字也有優化機制:

>>> a = 256
>>> b = 256
>>> id(a)
1382085376
>>> id(b)
1382085376


>>> c = -5
>>> d = -5
>>> id(c)
1382081200
>>> id(d)
1382081200

但是超過這個範圍可就不太行了:

>>> a = 257
>>> b = 257
>>> id(a)
31257136
>>> id(b)
31257200


>>> c = -6
>>> d = -6
>>> id(c)
31257280
>>> id(d)
31257296

例3:一個變量名2個值

name = oldboy
name = alex
print(name)

打印上邊這段代碼會得到什麽結果?

我想大家的答案是一致的,name此時應該是‘alex’,當我們在程序中對變量進行重復賦值時,就是對一個變量進行修改.

代碼解讀:

程序先申請了一塊內存空間來存儲‘oldboy’,讓name變量名指向這塊內存空間

讀到name=‘alex’之後又申請了另一塊內存空間來存儲‘alex’,並讓原本指向‘oldboy’內存的鏈接斷開,讓name再指向‘alex’。

如下圖所示:

技術分享圖片

例4:變量的賦值與修改

>>> name1 = ‘ike‘
>>> name2 = name1
>>> name1 = ‘jack‘
>>> name1
‘jack‘
>>> name2
‘ike‘

修改name1的值,相當於斷開了name1與‘ike’的鏈接,重新建立name1和‘jack’之間的鏈接。在這個過程中,始終沒有影響到name2和‘ike‘之間的關系,因此name2還是‘ike’,而name1變成了‘jack’。

總結:本文介紹了使用id查看變量內存的方法,python解釋器對於字符串和數字做出了[-5,257)的優化以及變量的賦值和修改。

python----基礎之變量的創建與id