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


變量的創建與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)的優化以及變量的賦值和修改。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM