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

53

在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支持,我仍然对像这样在列表中混合类型的内容持谨慎态度。由于混合数据类型的列表不会被用于任何处理,除了将其分配给变量之外(它所分配的变量是会被处理的,但列表本身不会),我认为这是可以的,但我想确认一下这不会成为潜在问题的代码。

6
从技术角度来说,数组元素实际上都是同一种类型——引用(指向对象的引用)。 - John La Rooy
4个回答

68

没问题,你可以在 列表 中存储任何类型的数据,这与“古老的日子”里其他编程语言中只允许数组存储一个数据类型的数据不同。

由于列表还可以存储其他列表、组合数据结构以及其他对象引用,所以通过列表进行处理或迭代可能会变得更加复杂,因为可能存在多层级别,而不能像简单的单层迭代数组一样。这也涉及到浅复制和深复制

如果处理列表的代码意识到这一点,我想不到任何由于该能力存储不同类型的数据而导致的问题。


谢谢。我知道我可以存储任何数据类型,但我想确保没有问题在早期就能简单避免。 - Ricardo Altamirano
4
@RicardoAltamirano,由此产生的唯一问题是代码处理列表需要考虑到这一点,因为列表可以包含嵌套的列表或其他数据结构。除此之外,我想不出还有什么问题了。 - Levon
好的,处理data列表的代码已经全部完成。它仅仅使用了random.choice,据我所知应该可以正确处理。 - Ricardo Altamirano
@RicardoAltamirano 同意,我也不见有问题 :) - Levon

23

使用列表混合类型在Python语言中是可以的,但你应该知道Python社区可能会对此不太赞同。当你有一个已知的混合类型的集合,并且不同的索引具有不同的语义时,通常会使用元组。而当你有一个长度变化的统一序列时,通常会使用列表。

因此,按照惯例,你的数据更应该表示为:

data = [
    ("name1", "long name1", 1, 2, 3),
    ("name2", "long name2", 5, 6, 7),
    ...
]
更简洁地说,元组与C语言的结构体类似,而列表则类似于C语言的数组。

如果你的元组很长或在代码中使用了多次,你可能想要定义一个类,这样你就可以在其中的每个位置命名对象。 - Josiah Yoder

8

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


这正是我所想的,但由于我只会将列表中的数据分别在它们各自的变量中使用,所以我认为这不会有任何影响。 - Ricardo Altamirano

2

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

如果其他代码正在使用它,但不知道列表中的类型及其顺序,则我认为存在问题。一个简单的例子:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接