python列表嵌套元组拆分_Python的元组嵌套列表,列表方法改变元组内列表,那元组还算不可变么?...

python的元组、列表其实都像上面画的一样,并不是“箱子”,里面放着“apple” 2233,它们里面都只有一些“箭头”,也就是说只存储了其它对象(也就是“apple” 2233这样的“物体”)的“名字”,这些“名字”指示了这些对象在内存中的地址,也就是在第几个字节的位置。python通过读取这些“名字”就能找到真正的“物体”在哪里。

所以说你执行append之后,那个列表改变了,但是仍然留在原来的位置,元组里面的3个箭头也是指向原来的方向。刚刚也说了这些箭头才是元组的本体,箭头没有变元组就没有变。所以这里的“不可变”只是说箭头永远指向那个方向,但那个方向里面是什么信息,就不知道了。

为什么要搞这么反人类的设计?这是有理由的。python是动态类型的语言,一个元组里完全可以放下str int list 三样东西,但是这就会引进一个问题,那就是不同类型的元素占用的内存大小不同,很难管理。

举个例子,如果python使用的是静态类型的运作方式,这个时候我输入

lst=[1,2,3,4] ; lst[2]=“apple”

那么事情就会变成下面那样。(我假设数字和字母都是4字节的)

可以看到,由于apple占用的空间是一个数字的5倍,它不仅占了lst[2]的位置,还把后面的位置都占了,这就很不好。而如果能像C语言 go语言那样事先确定一个元素就是4个字节,让你只能往里面写入整数类型的数据,就能保证不会“殃及”后面的信息了。(当然这里只是打个比方而已)

所以python就利用了计算机上最基础的“地址”概念。不直接把元素放在列表里,而是放在别的地方,列表里只存储它们的地址,需要使用的时候通过cpu的“寻址”指令找到对应的信息。可以看到,不管是apple还是1 2 3,它们的地址信息都是32位,就不存在殃及后面元素的情况了。js python ruby lua这些动态类型的语言,为了实现动态类型的功能,都是这么做的。C C++的对象都有类似的想法。

(其实上面的list tuple每个都有2层箭头,上面只画了一层,是为了简化)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值