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

Ric*_*ano 30 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)
Run Code Online (Sandbox Code Playgroud)

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

Lev*_*von 39

不,没问题,你可以在列表中存储任何类型,这与"过去的日子"不同,当时其他语言的阵列只需要存储一种类型的数据.

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

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

  • @RicardoAltamirano由此产生的唯一问题是代码处理列表需要考虑到这一点,因为列表可以包含列表本身或其他数据结构.否则,我想不出有任何问题. (3认同)

Ned*_*der 15

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

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

data = [
    ("name1", "long name1", 1, 2, 3),
    ("name2", "long name2", 5, 6, 7),
    ...
]
Run Code Online (Sandbox Code Playgroud)

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


Bre*_*arn 7

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