1. 程式人生 > >Python 變數、記憶體、動態語言

Python 變數、記憶體、動態語言

前言:
python 的資料型別有字串、數字、列表、元組、字典

問題:
1.Python中,變數是可變,還是不可變型別?
2.如何判斷是否是同一個物件

變數:

  • 變數名:必須是大小寫英文、數字、_的組合,且不能使用數字開頭。
  • 在Python中,不需要事先宣告變數的型別,變數的型別和值再賦值的那一刻被初始化(宣告和定義一起完成)
  • 在Python中,等號 =是賦值語句,可以把任意資料型別賦值給變數,同一個變數可以反覆賦值,而且可以是不同的型別。
a = 111     # a是整數
print a
a = 'Good'  # a變為字串
print a
  • 動態語言:python這種變數本身型別不固定的語言稱之為動態語言。 與之對應的是靜態語言,靜態語言在定義變數時必須指定變數的型別,如果賦值時型別不匹配,就會報錯。
    和靜態語言相比,動態語言更靈活,原因來自於此。
# java
int a = 123; // a是整數型別變數
a = "ABC";   // 錯誤:不能把字串賦給整型變數
  • 請不要把賦值語句的=等同於數學的等號。
x = 10
x = x + 9

從數學上理解 x = x + 9,無論如何不會成立,但在程式中,賦值語句從右向左計算,先計算右側的表示式 x+2,得到12,再賦值給變數x。x的值,從10變為12

  • 最後理解下變數在計算機記憶體中的表示。
  • 當寫a = 'ABC'時,Python直譯器做了兩件事,
    1.在記憶體中建立了一個’ABC’的字串;
    2.在記憶體中建立了一個名為a的變數,並把它指向’ABC’
  • a = 'ABC'
    b = a
    a = 'XYZ'
    print(b)

    步驟詳解:
    1.在記憶體中建立了一個’ABC’的字串;
    2.把變數a賦值給變數b,實際上是把變數b指向變數a所指向的資料
    3.把一個新物件(XYZ)賦值給變數a
    4.列印b的值,依然是’ABC’

常量
所謂的常量,是指不能變的變數,比如數學常數π。
在Python中,通常用全部大寫的變數名錶示常量:

PI = 3.141592653

但事實上PI依然是一個變數,Python根本沒有任何機制保證PI不會被改變。所以,用全部大寫的變數名錶示常量只是一個習慣上的用法,如果一定要改變變數PI的值,也是可以的。

如何判斷是否是同一個物件

判斷是否是同一個物件,也可以理解為是否是同一塊記憶體地址。
為了探索物件在記憶體的儲存,可以求助於python的內建函式id()。它用於返回物件的身份(identity),所謂的身份,就是該物件的記憶體地址。

a = 1
b = 1
print id(a)         # 返回記憶體地址的十進位制
print hex(id(a))    # 返回記憶體地址的十六進位制
print id(b)
print hex(id(b))
print a is b        # is(身份運算子)用於判斷兩個引用所指的物件是否相同

第一次啟動直譯器,輸出結果為:

5874392
0x59a2d8
5874392
0x59a2d8
True

a和b實際上是指向同一個物件的兩個引用。

第二次啟動直譯器,輸出結果為:

6333144
0x60a2d8
6333144
0x60a2d8
True

原因解釋:

Python有個特別的機制,它會在直譯器啟動的時候事先分配好一些緩衝區,這些緩衝區部分是固定好取值,例如整數[-5,256]的記憶體地址是固定的(這裡的固定指這一次程式啟動之後,這些數字在這個程式中的記憶體地址就不變了,但是啟動新的python程式,兩次的記憶體地址不一樣)。有的緩衝區就可以重複利用。這樣的機制就使得不需要python頻繁的呼叫記憶體malloc和free。

引用:
有關內容,參照以下連結:
http://blog.csdn.net/liweiblog/article/details/64128241
http://blog.csdn.net/weixin_38111819/article/details/79235943
作者:Vamei 出處:http://www.cnblogs.com/vamei