49

在 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 支持它,我对在列表中混合这样的类型持谨慎态度。由于混合数据类型列表不会用于任何处理,除了变量赋值本身(它分配给的变量将,但不是列表本身),我认为这很好,但我想确保这一点不是秘密有问题的代码。

4

4 回答 4

61

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

由于列表还可以存储其他列表和其他复合数据结构以及其他对象引用,因此由于可能存在多个层,处理或遍历列表可能会变得更复杂,而不仅仅是在简单的单级迭代中遍历数组. 这也与浅拷贝和深拷贝有关。

如果处理列表的代码知道这一点,由于这种将不同事物存储在列表中的能力,我想不出任何问题。

于 2012-07-09T00:10:54.313 回答
19

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

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

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

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

于 2012-07-09T01:13:45.020 回答
8

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

于 2012-07-09T00:11:12.090 回答
1

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

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

>>> min(['-2', 1])
1
于 2018-04-03T05:31:19.000 回答