【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
每个学过Python 的人都听说过LIST与Tuple的区别:”LIST能改变内部值,Tuple不能改变内部值。“ ,由此引发了这篇文章。而在改变内部值的同时我们也能学到变量与变量之间传递的不同。
现在让我们先看一段代码:
#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个列表赋值,企图通过改变列表变量的值来改变元组。结果输出如下:
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进行赋值:
#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]
结果如下所示:
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()
id() 方法返回一个类似内存地址的一串数字,以用作Python内部标识。
让我们看看各种赋值之间有什么不同?以下是各种赋值测试代码:
例 1:
#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中的第二次列表与元组赋值语句相当于仅改变当前内存中列表与元组的值。
来源:oschina
链接:https://my.oschina.net/u/2420772/blog/608268