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

posted @ 2017-10-21 15:28  深藍  阅读(251)  评论(0编辑  收藏  举报