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

  • 相关阅读:
    对WEB标准以及W3C的理解与认识
    px和em的区别
    数组去重的方法
    什么是CSS Hack?
    在网页中应该使用奇数还是偶数的字体大小?为什么?
    ajax的封装过程
    WebService简介及使用
    SQL 不能插入重复键-错误 主键列是自动增长
    SqlServer语句执行
    正则表达式
  • 原文地址:https://www.cnblogs.com/deepblue775737449/p/7704898.html
Copyright © 2011-2022 走看看