列表与元组,何时使用?[重复]

2025-02-28 08:23:00
admin
原创
79
摘要:问题描述:在 Python 中,什么时候应该使用列表,什么时候应该使用元组?有时候你别无选择,例如如果你有"hello %s you are %s years old" % x 那么 x 一定是一个元组。但是如果我是设计 API 并选择数据类型的人,那么指导原则是什么?解决方案 1:元组本...

问题描述:

在 Python 中,什么时候应该使用列表,什么时候应该使用元组?

有时候你别无选择,例如如果你有

"hello %s you are %s years old" % x

那么 x 一定是一个元组。

但是如果我是设计 API 并选择数据类型的人,那么指导原则是什么?


解决方案 1:

元组本质上是固定大小的,而列表是动态的。

换句话说,atuple不可变的,而 alist可变的

  1. 不能向元组添加元素。元组没有附加或扩展方法。

  2. 不能从元组中删除元素。元组没有 remove 或 pop 方法。

  3. 您可以在元组中找到元素,因为这不会改变元组。

  4. 您还可以使用in运算符来检查元组中是否存在某个元素。


  • 元组比列表更快。如果您要定义一组常量值,并且您要对其进行的所有操作就是对其进行迭代,请使用元组而不是列表。

  • 如果对不需要更改的数据进行“写保护”,代码会更安全。使用元组而不是列表就像有一个隐含的断言语句,即该数据是常量,需要特殊的想法(和特定函数)来覆盖它。

  • 某些元组可用作字典键(具体来说,包含不可变值的元组,如字符串、数字和其他元组)。列表永远不能用作字典键,因为列表是可变的。

来源:深入 Python 3

解决方案 2:

有一种强烈的文化认为元组用于异构集合,类似于struct在 C 中使用 s ,列表用于同构集合,类似于数组。但我从来没有完全理解这与其他答案中提到的可变性问题。可变性是有约束力的(你实际上不能改变元组),而同构性不是强制的,所以似乎是一个不那么有趣的区别。

解决方案 3:

我相信(而且我不太精通 Python)主要区别在于元组是不可变的(赋值后不能就地更改)而列表是可变的(可以附加、更改、减去等)。

因此,我倾向于使元组成为分配后不应该改变的东西,而使列表成为可以改变的东西。

解决方案 4:

它必须可变吗?使用列表。它必须不可变吗?使用元组。

否则,这是一个选择的问题。

对于异构对象的集合(例如分为姓名、街道、城市、州和邮政编码的地址),我更喜欢使用元组。它们总是可以轻松升级为命名元组。

同样,如果要迭代集合,我更喜欢列表。如果它只是一个将多个对象作为一个整体保存的容器,我更喜欢元组。

解决方案 5:

您需要决定的第一件事是数据结构是否需要可变。如前所述,列表是可变的,而元组则不是。这也意味着元组可以用作字典键,而列表不能。

根据我的经验,元组通常用于顺序和位置有意义且一致的地方。例如,在为选择自己的冒险游戏创建数据结构时,我选择使用元组而不是列表,因为元组中的位置是有意义的。以下是该数据结构的一个示例:

pages = {'foyer': {'text' : "some text", 
          'choices' : [('open the door', 'rainbow'),
                     ('go left into the kitchen', 'bottomless pit'),
                     ('stay put','foyer2')]},}

元组中的第一个位置是用户玩游戏时显示的选择,第二个位置是选择所指向的页面的键,这对于所有页面都是一致的。

元组的内存效率也比列表更高,尽管我不确定这种好处何时会显现出来。

另请查看《Think Python》中有关列表和元组的章节。

解决方案 6:

但是如果我是设计 API 并选择数据类型的人,那么指导原则是什么?

对于输入参数,最好接受最通用的接口来满足您的需要。它很少只是一个元组或列表 - 更常见的是序列、可切片甚至可迭代。除非您明确检查输入类型,否则 Python 的鸭子类型通常会免费获得它。除非绝对不可避免,否则不要这样做。

对于您生成的数据(输出参数),只需返回最方便的数据,例如返回您保留的任何数据类型或您的辅助函数返回的任何数据类型。

要记住的一件事是避免返回属于你的状态的列表(或任何其他可变内容),例如

class ThingsKeeper
    def __init__(self):
        self.__things = []

    def things(self):
        return self.__things  #outside objects can now modify your state

    def safer(self):
        return self.__things[:]  #it's copy-on-write, shouldn't hurt performance

解决方案 7:

列表相对于元组的一个微小但显著的优势是列表往往更容易移植。标准工具不太可能支持元组。例如,JSON 没有元组类型。YAML 有,但其语法与其列表语法相比很丑陋,列表语法相当不错。

在这些情况下,您可能希望在内部使用元组,然后在导出过程中将其转换为列表。或者,您可能希望在任何地方都使用列表以保持一致性。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2941  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1803  
  PLM(产品生命周期管理)系统在企业的产品研发、生产与管理过程中扮演着至关重要的角色。然而,在实际运行中,资源冲突是经常会遇到的难题。资源冲突可能导致项目进度延迟、成本增加以及产品质量下降等一系列问题,严重影响企业的效益与竞争力。因此,如何有效应对PLM系统中的资源冲突,成为众多企业关注的焦点。接下来,我们将详细探讨5...
plm项目管理系统   31  
  敏捷项目管理与产品生命周期管理(PLM)的融合,正成为企业在复杂多变的市场环境中提升研发效率、增强竞争力的关键举措。随着技术的飞速发展和市场需求的快速更迭,传统的研发流程面临着诸多挑战,而将敏捷项目管理理念融入PLM,有望在2025年实现研发流程的深度优化,为企业创造更大的价值。理解敏捷项目管理与PLM的核心概念敏捷项...
plm项目   31  
  模块化设计在现代产品开发中扮演着至关重要的角色,它能够提升产品开发效率、降低成本、增强产品的可维护性与可扩展性。而产品生命周期管理(PLM)系统作为整合产品全生命周期信息的关键平台,对模块化设计有着强大的支持能力。随着技术的不断发展,到 2025 年,PLM 系统在支持模块化设计方面将有一系列令人瞩目的技术实践。数字化...
plm软件   28  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用