每一個學過Python 的人都據說過LIST與Tuple的區別:」LIST能改變內部值,Tuple不能改變內部值。「 ,由此引起了這篇文章。而在改變內部值的同時咱們也能學到變量與變量之間傳遞的不一樣。python
如今讓咱們先看一段代碼:測試
#encoding=utf8 a = [1,2] b = [3,4] c = [5,6] t = (a,b,c) print t[0:3] a = [10,11] b = [12,13] c = [14,15] print t[0:3]
首先,Candy爲了打破元組不能改變內容,將元組t內部的值分別用列表a,b,c來代替。而後咱們從新給 3個列表賦值,企圖經過改變列表變量的值來改變元組。結果輸出以下:code
C:\pypy27\pypy.exe D:/ProjectSpace/test/mymodule.py ([1, 2], [3, 4], [5, 6]) ([1, 2], [3, 4], [5, 6]) Process finished with exit code 0
天哪! 我看到了什麼?元組t的內容竟然沒有改變。讓咱們在下面再增長打印a、b、c的值:內存
C:\pypy27\pypy.exe D:/ProjectSpace/test/mymodule.py ([1, 2], [3, 4], [5, 6]) ([1, 2], [3, 4], [5, 6]) [10, 11] [12, 13] [14, 15] Process finished with exit code 0
奇怪,列表的值已經改變了。 爲何元組沒改變呢?爲了測試,我將從新再給元組t進行賦值:it
#encoding=utf8 a = [1,2] b = [3,4] c = [5,6] t = (a,b,c) print t[0:3] a = [10,11] b = [12,13] c = [14,15] t = (a,b,c) print t[0:3]
結果以下所示:class
C:\pypy27\pypy.exe D:/ProjectSpace/test/mymodule.py ([1, 2], [3, 4], [5, 6]) ([10, 11], [12, 13], [14, 15]) Process finished with exit code 0
好的,事情徹底按照Candy所想的方向發展!可是爲了知道爲何要二次從新賦值才能更新元組,Candy 使用了咱們經常使用的一個方法:id()test
id() 方法返回一個相似內存地址的一串數字,以用做Python內部標識。變量
讓咱們看看各類賦值之間有什麼不一樣?如下是各類賦值測試代碼:module
例 1:coding
#encoding=utf8 a = [1,2] b = [3,4] c = [5,6] t = (a,b,c) print t[0:3] print id(a) , id(b) ,id(c) , id(t) a = [10,11] b = [12,13] c = [14,15] t = (a,b,c) print t[0:3] print id(a) , id(b) ,id(c) , id(t)
結果是這樣的:
C:\pypy27\pypy.exe D:/ProjectSpace/test/mymodule.py ([1, 2], [3, 4], [5, 6]) 41459216 41459232 41459248 41483460 ([10, 11], [12, 13], [14, 15]) 41459264 41459280 41459296 41483472 Process finished with exit code 0
——————————————————
例 2:
#encoding=utf8 a = [1,2] b = [3,4] c = [5,6] t = (a,b,c) print t[0:3] print id(a) , id(b) ,id(c) , id(t) a[0],a[1] = [10,11] b[0],b[1] = [12,13] c[0],c[1] = [14,15] t = (a,b,c) print t[0:3] print id(a) , id(b) ,id(c) , id(t)
結果是這樣的:
C:\pypy27\pypy.exe D:/ProjectSpace/test/mymodule.py ([1, 2], [3, 4], [5, 6]) 41459216 41459232 41459248 41483448 ([10, 11], [12, 13], [14, 15]) 41459216 41459232 41459248 41483460 Process finished with exit code 0
——————————————————
例 3:
#encoding=utf8 a = [1,2] b = [3,4] c = [5,6] t = (a,b,c) print t[0:3] print id(a) , id(b) ,id(c) , id(t) a[0],a[1] = [10,11] b[0],b[1] = [12,13] c[0],c[1] = [14,15] print t[0:3] print id(a) , id(b) ,id(c) , id(t)
結果是這樣的:
C:\pypy27\pypy.exe D:/ProjectSpace/test/mymodule.py ([1, 2], [3, 4], [5, 6]) 41786896 41786912 41786928 41811140 ([10, 11], [12, 13], [14, 15]) 41786896 41786912 41786928 41811140 Process finished with exit code 0
不知道你們是否已經發現,僅從id方法的返回值咱們能夠獲得如下觀點:
例1中的第二次列表與元組賦值語句至關於從新申請了一個列元組與三個列表的內存地址用於存放當前值。
例2中的第二次列表與元組賦值語句至關於改變已經申請好的列表內存值而且賦值給一個從新構造的元組。
例3中的第二次列表與元組賦值語句至關於僅改變當前內存中列表與元組的值。