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

  • 相关阅读:
    Django之admin
    CSS弹性盒子
    SQL SERVER按多字段查找重复的数据并删除只保留一条
    计算机名称改名之后,tfs连接问题
    Docker镜像仓库Harbor部署
    搭建docker本地仓库
    部署docker swarm集群
    Dockerfile
    centos 7 安装docker 常用指令
    python软件安装-Windows
  • 原文地址:https://www.cnblogs.com/deepblue775737449/p/7704898.html
Copyright © 2011-2022 走看看