繁体   English   中英

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

[英]Am I safe mixing types in a Python list?

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

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

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

如果处理列表的代码知道这一点,我想不出任何问题,因为这种在列表中存储不同内容的能力。

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM