zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    获取自定义属性的值
    当前窗口,父级窗口,顶层窗口
    图片一直居中,并且窗口变小图片两端缩小,但是图片还是居中。
    解决IE打开时,弹出的提示调用active的问题,阻止js运行。
    $.fn.exted({})与$.extend({})区别
    rem与部分手机 字体偏大问题
    Python 内部函数
    Python lambda表达式
    Python 函数动态参数
    python 邮件发送
  • 原文地址:https://www.cnblogs.com/deepblue775737449/p/7704898.html
Copyright © 2011-2022 走看看