zoukankan      html  css  js  c++  java
  • [Python] list vs tupple

    前言

    列表(list)和 元组(tupple) 是 Python 中常见的两种数据结构.这两者使用方法有一定的相似,俩者都是 Python 内置类型,都可以保存数据集合,都可以保存复合数据,我们同样可以通过索引去访问它们.

    那么问题来了,俩者究竟有区别吗???

    list 和 tupple 的区别

    首先回答问题.list 和 tupple 有区别吗?答案是肯定的,两者有区别. list 和 tupple 的本质区别在于,前者是一个可变对象而后者是一个不可变对象。

    什么是可变对象和不可变对象呢?简单地来说,可变对象就是创建之后可以修改,而不可变对象则是创建之后不允许在修改。

    没关系,让我们看一下例子

    首先创建一个 list

    >>> a = ["a","b","c","d"]
    

    接着我们试着修改一下上面的 list , 将 b 改成 e,看看会发生什么

    >>> a[1] = "e"
    >>> a
    ['a', 'e', 'c', 'd']
    

    好像什么都没有发生~~

    没关系,我们再来创建一个 tupple

    >>> b=("a","b","c","d")
    

    同样地,让我们将 tupple 中的 b 改成 e

    >>> b[1]="2"
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: 'tuple' object does not support item assignment
    

    为什么同样的赋值操作,在 tupple 中会出现错误呢?原因就是我们上面说到的 tupple 是不可变对象,创建之后不能修改

    有个小伙伴看见了

    然后给我写了一段下面的代码

    >>> b=("a","b","c","d")
    >>> b=("a","e","c","d")
    >>>b
    >>>("a","e","c","d")
    

    这样子是不是做到了修改 tupple 中的第2个元素呢?答案是否定的,为什么呢?别着急往下看

    可变对象和不可变对象

    在开始下面的内容之前,需要牢记一句话,Python 中的变量是对在内存中 Python 对象的引用

    以我们上面的列表 a 为例

    >>> a = ["a","b","c","d"]
    

    它在内存中实际表现如下图

    如果需要获取列表 list 在内存的实际位置,我们可以借用内置函数 id()

    >>> a=["a","b","c","d"]
    >>> id(a)
    4557552456
    

    现在我们去修改一下 a[1] 的值,然后再用 id() 这个函数去获取 a 在内存的地址,你会发现它的值没有改变,仍然指向相同位置

    >>> a[1] = "e"
    >>> id(a)
    4557552456
    

    整个过程如下图

    接下来我们看一下对 tupple 进行同样的操作会有什么变化

    >>> a=("a","b","c","d")
    >>> id(a)
    4557412296
    >>> a=("a","e","c","d")
    >>> id(a)
    4557586504
    

    不难发现,再修改之后指向内存中的地址发生了改变,这意味着这个时候变量 a 指向了一个全新的对象。

    如果觉得难以理解,没有关系,看下面的图

    这个时候如果没有其它变量指向之前的 tupple,Python 的 GC 将会把旧的 tupple 从内存中完全删除.

    为什么需要 list 和 tupple ?

    其实更贴切的应该问,为什么需要可变对象和不可变对象呢?

    1. 添加元素效率

    从上面的内容,我们知道一旦创建了 tupple,这个时候任何修改操作都会去创建新的对象,然后变量重新指向新的对象,假设添加的元素足够多,其效率可想而知。这里的添加是指如下的操作( tupple 本身没有添加的方法)

    a = ()
    for i in range(num):
        a = a + (i,)
    
    1. debugger 难度

    在之前的 [直接赋值,深拷贝和浅拷贝] 中提到可变对象,修改赋值后的变量,会对原有的变量造成影响,会导致其 value 值的改变,在实际开发过程中很容易被忽略

    >>> a = [1, 3, 5, 7]
    >>> b = a
    >>> b[0] = -10
    >>> a
    [-10, 3, 5, 7]
    

    什么时候去使用 tupple 和 list

    总结一下,list 和 tupple 的使用场景

    1. tupple 不存在添加和删除的操作,更不存在修改的操作,如果有这些需求,不用使用 tupple,去用 list
    2. 如果只是遍历的话, tupple 的速度是比 list 要快的
    3. 如果你有些数据是需要写保护,不希望在运行过程中被修改的话,用 tupple
    4. tupple 可以用来做 dict 的 key 的,准确的说,所有不可变对象都可以,而 list 不可以

    参考

    https://learnbatta.com/blog/why-tuple-is-faster-than-list-in-python-22/

    https://www.afternerd.com/blog/difference-between-list-tuple/

    https://www.programiz.com/python-programming/list-vs-tuples

  • 相关阅读:
    java.sql.SQLException: Access denied for user 'root'@'10.1.0.2' (using password: YES)
    在eclipse中安装使用lombok插件
    Socket编程实践(5) --TCP粘包问题与解决
    Socket编程实践(8) --Select-I/O复用
    Socket编程实践(6) --TCP服务端注意事项
    Socket编程实践(4) --多进程并发server
    Socket编程实践(3) --Socket API
    Socket编程实践(2) --Socket编程导引
    Socket编程实践(1) --TCP/IP简述
    Socket编程实践(11) --epoll原理与封装
  • 原文地址:https://www.cnblogs.com/leetao94/p/13233657.html
Copyright © 2011-2022 走看看