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

时间:2012-07-09 00:09:18

标签: python

在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 个答案:

答案 0 :(得分:35)

不,没问题,您可以将任何类型存储在list内,而不像“过去的日子”那样,其他语言的阵列只需要存储一种类型的数据。

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

有关

如果处理列表的代码知道这一点,我就不会想到由于在列表中存储不同内容的能力而导致的任何问题。

答案 1 :(得分:12)

在列表中混合类型时,语言很好,但是你应该知道Python文化可能会对它不屑一顾。当您拥有已知的混合类型集合时,通常会使用元组,并且不同的索引具有不同的语义。列表通常用于具有不同长度的统一序列的位置。

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

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

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

答案 2 :(得分:7)

列表中包含多种数据类型没有固有的问题。当然,如果您尝试将该列表用于期望它具有相同类型的某些内容,则可能会出现问题。在您的示例中,如果您正在使用它,那么它就无法成为问题。但是,您可以考虑使用元组而不是列表。按照惯例,当序列的组成固定时使用元组;您可以在序列中添加或删除列表。

答案 3 :(得分:0)

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

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

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