【问题标题】:Am I safe mixing types in a Python list?我在 Python 列表中混合类型是否安全?
【发布时间】:2020-09-24 10:35:57
【问题描述】:

在 Python 列表中混合不同类型是否存在无法预料的问题?例如:

import random
data = [["name1", "long name1", 1, 2, 3],
        ["name2", "long name2", 5, 6, 7]]
name, long_name, int1, int2, int3 = random.choice(data)

我正在使用这段代码在一个函数中随机设置几个相关参数,但即使 Python 支持它,我还是对在列表中混合这样的类型持谨慎态度。由于混合数据类型列表不会用于任何处理,除了变量赋值本身(它分配给的变量将,但不是列表本身),我认为这很好,但我想确保这一点不是秘密有问题的代码。

【问题讨论】:

  • 从技术上讲,数组元素都是都是同一种类型——引用(对象)

标签: python


【解决方案1】:

没问题,您可以将任何类型存储在 list 中,这与“过去”中其他语言的数组只需要存储一种类型的数据不同。

由于列表还可以存储其他列表和其他复合数据结构,以及其他对象引用,因此处理或遍历列表可能会由于可能存在多个层而变得更加复杂,而不是简单地遍历数组单级迭代。这也和shallow and deep copying有关。

如果处理列表的代码知道这一点,我想不出任何问题,因为这种能力可以在列表中存储不同的东西。

【讨论】:

  • 谢谢。我知道我可以存储任何数据类型,但我想确保不会出现我可以在早期就避免的问题。
  • @RicardoAltamirano 唯一引起的问题是代码处理列表需要考虑这一点,因为列表可以包含列表本身或其他数据结构。否则,我想不出这有什么问题。
  • 嗯,处理data 列表的代码就在那里。无非就是random.choice,据我所知应该能妥善处理。
  • @RicardoAltamirano 同意,我也没有发现问题 :)
【解决方案2】:

该语言可以在列表中混合类型,但您应该知道 Python 文化可能不赞成它。当您拥有已知的混合类型集合并且不同的索引具有不同的语义时,通常会使用元组。列表通常用于具有不同长度的统一序列的情况。

因此您的数据将更传统地表示为:

data = [
    ("name1", "long name1", 1, 2, 3),
    ("name2", "long name2", 5, 6, 7),
    ...
]

更简洁地说:元组像 C 结构体一样使用,列表像 C 数组一样使用。

【讨论】:

  • 如果你的元组很长或者在代码中使用了很多地方,你可能想要定义一个类,这样你就可以在其中的每个位置命名对象。
【解决方案3】:

在一个列表中包含多种数据类型并没有固有的问题。当然,如果您尝试将该列表用于期望它都是相同类型的东西,则可能会出现问题。在您的示例中,如果这就是您正在做的所有事情,那么它就不会成为问题。不过,您可能会考虑使用元组而不是列表。按照惯例,当序列的组成固定时使用元组;当您可以在序列中添加或删除时使用列表。

【讨论】:

  • 我是这么想的,但是由于我只会在它们各自的变量中分别使用列表中的数据,我认为这不会有害。
【解决方案4】:

如果您只是使用它来存储不同的可能输出——这些输出遵循你的函数合同name, long_name, int1, int2, int3——那么没问题。

如果其他不知道列表中的类型及其顺序的代码正在使用它,那么我确实看到了问题。一个简单的例子:

>>> min(['-2', 1])
1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    • 1970-01-01
    • 1970-01-01
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多