zoukankan      html  css  js  c++  java
  • python 元组(tuple)和列表(list)区别

    一、前言

    想必大家都知道,在Python数据类型中有两个对象:元组 tuple 和列表 list 。

    它们的写法和用法都十分相似,傻傻分不清楚。可能有的同学就会疯狂的去网上查找它们之间的区别了,可是查到的无外乎有以下几种说法:

    list 是可变的对象,元组 tuple 是不可变的对象!

    由于 tuple 不可变,所以使用 tuple 可以使代码更安全!等等 ...

    但是 tuple 究竟有什么用呢,到头来还是不知道。

    二、tuple 

    其实在很多比较“资深”的编程语言里开始是没有元组的,比如:Java、C++、C# 等,但是由于元组的灵活和便捷性,最后这些编程语言也都纷纷加上了。并且很多年轻的编程语言 Python、Scala 等,一开始就内置了元组类型。

    之所以元组这么受欢迎,其实最关键的一点是它的语法的灵活和便捷性,提高了编程体验。其中最大的一个特性就是使函数可以返回多个值,这个特性很常用。

    1. 函数返回(return)多个值

    函数返回多个值?对,你没有听错。函数是可以返回多个值的。如:

    非常简单,就是一个返回坐标值(x , y)的函数,我们同时获取了多个值 x 和 y 。

    但是这和 tuple元组有什么关系了?

    其实这里存在一个假象,Python函数返回的值本质上还是一个单值,看下面代码:

    从打印结果可以看出,这里返回值就是一个tuple!由于在语法上,返回一个tuple是可以省略括号的,而多个变量可以同时接收一个tuple,按位置赋给对应的值。

    所以,Python的函数返回多值时,其实就是返回一个tuple。是不是突然觉得 tuple 帮了大忙,使结果的获取更简单了呢?

    2. tuple 不可变的好处

    相对于 list 而言,tuple 是不可变的,这使得它可以作为 dict 的 key,或者扔进 set 里,而 list 则不行。

    tuple 放弃了对元素的增删(内存结构设计上变的更精简),换取的是性能上的提升:创建 tuple 比 list 要快,存储空间比 list 占用更小。所以就出现了“能用 tuple 的地方就不用 list”的说法。

    多线程并发的时候,tuple 是不需要加锁的,不用担心安全问题,编写也简单多了。

    二、元组到底可不可以被修改

    1、创建和访问一个元组如果创建一个空元组,直接使用小括号即可;
    如果要创建的元组中只有一个元素,要在它的后面加上一个逗号‘,’。

    >>> temp = ()
    >>> type(temp)
         <class 'tuple'>
    >>> temp = (1,)
    >>> type(temp)
        <class 'tuple'>
    >>> temp = (1)
    >>> type(temp)
        <class 'int'>
    >>> 8 * (8)
        64
    >>> 8 * (8,)
        (8, 8, 8, 8, 8, 8, 8, 8)

    元组里只有一个元素的时候,逗号(,)非常重要

    2、更新和删除元组

    直接在同一个元组上更新是不可行的,但是可以通过拷贝现有的元组片段构造一个新的元组的方式解决。

    通过分片的方法让元组拆分成两部分,然后再使用连接操作符(+)合并成一个新元组,最后将原来的变量名(temp)指向连接好的新元组。在这里就要注意了,逗号是必须的,小括号也是必须的!

    __author__ = 'Administrator'
     
    # -*- coding:utf-8 -*-
     
    temp = ("龙猫","泰迪","叮当猫")
    temp = temp[:2] + ("小猪佩奇",)+temp[2:]
    print(temp)
    """
    ('龙猫', '泰迪', '小猪佩奇', '叮当猫')
    Process finished with exit code 0
    """

    删除元组中的元素:对于元组是不可变的原则来说,单独删除一个元素是不可能的,当然你可以利用切片的方式更新元组,间接的删除一个元素。

    __author__ = 'Administrator'
     
    # -*- coding:utf-8 -*-
     
    temp = ('龙猫', '泰迪', '小猪佩奇', '叮当猫')
    temp = temp[:2] + temp[3:]
    print(temp)
    """
    ('龙猫', '泰迪', '叮当猫')
    Process finished with exit code 0
    """

    在日常中很少用del去删除整个元组,因为Python的回收机制会在这个元组不再被使用的时候自动删除。

    __author__ = 'Administrator'
     
    # -*- coding:utf-8 -*-
     
    temp = ('龙猫', '泰迪', '小猪佩奇', '叮当猫')
    del temp
    print(temp)
    """
    Traceback (most recent call last):
      File "F:/python_progrom/test.py", line 7, in <module>
        print(temp)
    NameError: name 'temp' is not defined
    Process finished with exit code 0
    """

    最后成员关系操作符 in 和 not in 也可以直接应用在元组上,这跟列表是一样的。

    __author__ = 'Administrator'
     
    # -*- coding:utf-8 -*-
     
    temp = ('龙猫', '泰迪', '小猪佩奇', '叮当猫')
    a ="泰迪"
    c = ('泰迪', '小猪佩奇')
    b = a in temp
    d =c in temp
    f =c not in temp
    print(b)
    print(d)
    print(f)
    """
    True
    False
    True
    Process finished with exit code 0
    """

    转载自:https://blog.csdn.net/ruanxingzi123/article/details/83184909

  • 相关阅读:
    [ZJOI2007]仓库建设(斜率dp优化)
    [HNOI2008]玩具装箱toy(斜率优化dp)
    2019牛客暑期多校训练营(第十场)F-Popping Balloons
    2019牛客暑期多校训练营(第十场)B-Coffee Chicken
    子集的生成—二进制枚举
    2019牛客暑期多校训练营(第九场)D-Knapsack Cryptosystem(思维+子集和)
    2019牛客暑期多校训练营(第九场) E-All men are brothers(并查集+组合数学)
    字符串的最小表示法
    2019牛客暑期多校训练营(第八场)
    [HDU4734] 不要62(数位dp入门)
  • 原文地址:https://www.cnblogs.com/oneDongHua/p/14264051.html
Copyright © 2011-2022 走看看