python学习笔记(5)—— tuple 本质探究
>>> t=(1,2,3,['a','b','c'],4,5) >>> t[3][0]='x' >>> t (1, 2, 3, ['x', 'b', 'c'], 4, 5) #tuple中嵌套的list中的元素可以改变 >>> t[3][1:3]='y','z' #索性改变全部list元素 >>> t (1, 2, 3, ['x', 'y', 'z'], 4, 5)
上例可以看到list全部元素改变,但tuple依然不报错,那么可以认为tuple指向的t[3]没变。
我个人初步理解是 为list:['x', 'y', 'z'] 分配的内存空间没变,所以tuple不报错,至于空间指向哪个元素无所谓,用id(obj)查验。
>>> l=['a','b','c'] >>> id(l) 37061960 >>> l[0]='x' >>> l ['x', 'b', 'c'] >>> id(l) 37061960 #改变一个元素,l的内存地址没变 >>> l[1:3]='y','z' >>> l ['x', 'y', 'z'] >>> id(l) 37061960 #全部元素改变,依然。 也许可以证明:设定一个list其实是为它创建一个内存地址,这个地址可以指向你想要的元素,而改变list本质上是改变了地址指向的元素,而list的本身内存地址不变,指向谁不影响本身。
#借此可以验证:tuple内元素不可变 指的是元素地址不可变。
关于tuple连接问题
>>> t1=(1,2,3) >>> id(t1) 36986168 >>> t2=('a','b','c') >>> id(t2) 36985736 >>> T=t1+t2 >>> T (1, 2, 3, 'a', 'b', 'c') >>> id(T) 36206536 >>> id(t1) 36986168 #t2+t2组成一个新tuple:T,但并没有改变t1、t2 >>> id(t2) 36985736 #如果是这样 >>> t1=t1+t2 >>> t1 (1, 2, 3, 'a', 'b', 'c') >>> id(t1) 36205960 #将t1与t2连接,并将结果赋给t1,相当于杀掉了t1,给他重新指定内存空间,它重生为一个新t1,和原来的id没关系了,自然会有一个新id指向它
最后引出一个问题:python中变量、内存地址、指向 之间的关系。
https://segmentfault.com/q/1010000009064908