美文网首页
python 的 tuple(元组) 是不是冗余设计?

python 的 tuple(元组) 是不是冗余设计?

作者: python大数据分析 | 来源:发表于2022-09-17 11:08 被阅读0次

    有人问,python 的 tuple(元组) 是不是冗余设计?因为它和list(列表)很像。

    先抛观点,tuple不是冗余设计,它最大的特点是不可变,在Python程序设计中非常重要。

    tuple与list区别

    tuple中文翻译成元组,它和list(列表)像是一对兄弟,两者都是容器,很多用途、方法都一致,主要的区别是list可变,tuple不可变,tuple更轻量。

    差异如下:

    不可变(Immutable)是什么意思?

    就是你不可以修改、增减tuple的值。 也因为 tuple 不可变的特性,所以没有append()、remove()、pop()等会更动值的操作。

    为什么tuple轻量,占用内存小?

    先看如下案例,存放同样的内容,元组的存储空间比列表要少16字节。

    主要是因为列表是动态的,需要存储指针,同时需要额外存储已经分配的长度大小,都会占用存储空间。

    为什么tuple更快?

    因为Python的垃圾回收机制,会回收不用的变量,而对于静态数据则会做资源缓存处理,这样调用元组的时候拿来即用,会加快运行速度。

    tuple使用场景

    1、作为函数返回容器。

    比如返回经纬度,存储的数据不需要变动,这时候使用tuple更准确、也节省内存。

    def get_location():
        ......
        return (lon,lat)
    
    

    2、作为字典的键

    我们知道Python字典的键要求不可变,如果你想将容器作为键,非tuple不可。

    3、打包解包

    打包是把一堆元素放到容器里,解包是把容器里的元素分别赋值给变量。

    比如说有这样一个元组t:

    >> t = ('foo', 'bar', 'baz', 'qux')
    
    

    上面就好像元组中的项目已被“打包”到对象中。

    你可以通过索引,获取其中的元素。

    >>> t
    ('foo', 'bar', 'baz', 'qux')
    >>> t[0]
    'foo'
    >>> t[-1]
    'qux'
    
    

    如果随后将该“打包”对象分配给新元组,则各个项目将“解包”到元组中的对象中。

    演示一下:

    >>> (s1, s2, s3, s4) = t
    >>> s1
    'foo'
    >>> s2
    'bar'
    >>> s3
    'baz'
    >>> s4
    'qux'
    
    

    其实也可以将打包解包合并成一个语句:

    (s1, s2, s3, s4) = ('foo', 'bar', 'baz', 'qux')
    
    

    tuple常用方法

    tuple的内置方法不是很多,毕竟不可变。

    综上所述,tuple和list是互补关系,很多场景需要不可变得特性。

    相关文章

      网友评论

          本文标题:python 的 tuple(元组) 是不是冗余设计?

          本文链接:https://www.haomeiwen.com/subject/mkfsortx.html