每一个学过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中的第二次列表与元组赋值语句至关于仅改变当前内存中列表与元组的值。