在python列表中混合类型是否安全?

Am I safe mixing types in a Python list?

在一个python列表中混合不同类型有没有不可预见的问题?例如:

1
2
3
4
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支持它,我还是要小心在列表中混合类似的类型。由于混合数据类型的列表除了本身和内部的变量分配(它分配给will的变量,而不是列表本身)之外,不会用于任何处理,所以我认为这是可以的,但我想确保这不是秘密的有问题的代码。


不,没问题,你可以在列表中存储任何类型的数据,而不像在"过去",其他语言的数组只需要其中存储一种类型的数据。

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

如果处理列表的代码意识到了这一点,那么我想不出任何问题,因为它能够将不同的东西存储在列表中。


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

因此,您的数据通常表示为:

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

简而言之:元组的用法类似于C结构,列表类似于C数组。


在一个列表中有多个数据类型没有固有的问题。当然,如果您试图将该列表用于希望它是完全相同类型的内容,则可能会出现问题。在您的示例中,如果这就是您所做的全部工作,那么它就不可能成为问题。不过,您可以考虑使用元组而不是列表。按照惯例,当序列的组合是固定的时,使用元组;当您可以添加到序列或从序列中删除时,使用列表。


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

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

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