在Python if语句中使用列表和元组

在Python if语句中使用列表和元组,python,list,if-statement,tuples,Python,List,If Statement,Tuples,我想知道在pythonifstations中,是否有充分的理由选择列表而不是元组,反之亦然。因此,以下各项在功能上是等效的,但就性能和编码风格而言,一项优于另一项,还是无关紧要 if x in (1,2,3): foo() if x in [1,2,3]: foo() 我似乎已经养成了使用元组的习惯,如果有2个或3个值和更长的列表,我认为,因为根据我的经验,元组往往很短,列表很长,但这似乎有点武断,可能不必要的不一致 我对人们能给出的任何一个例子都感兴趣,其中一个比另一个好

我想知道在python
if
stations中,是否有充分的理由选择列表而不是元组,反之亦然。因此,以下各项在功能上是等效的,但就性能和编码风格而言,一项优于另一项,还是无关紧要

if x in (1,2,3):
    foo()

if x in [1,2,3]:
    foo()
我似乎已经养成了使用元组的习惯,如果有2个或3个值和更长的列表,我认为,因为根据我的经验,元组往往很短,列表很长,但这似乎有点武断,可能不必要的不一致

我对人们能给出的任何一个例子都感兴趣,其中一个比另一个好


干杯

列表和元组的区别在于列表是可变的,元组是不可变的


人们倾向于将元组用于异构集合,类似于C中的结构,列表用于异构集合,类似于C中的数组。

元组的初始化(至少在CPython中)产生的字节码比
列表的字节码少,但这真的没什么好担心的。我相信会员资格测试几乎是一样的(尽管没有测试)

对于纯粹的成员资格测试,查找语义是相同的。从Python2.7开始,编写它就更好了(并暗示它只进行成员资格测试):

在此之前:

if x in set([1,2,3]):
    pass # do something

只是看起来有点笨拙…

集合比这两种可能的重复或更可取。集合更适合于成员资格测试,即
如果{1,2,3}:
(我认为这种语法只适用于py 2.6+,可能是2.7+)@DSM:我不同意;
if foo in literal_sequence:
语句的上下文是重要的,答案是使用集合,而不是元组或列表。我做了一些计时,发现在集合文本中测试成员资格比在元组文本中测试成员资格要慢。这可能是由于创建集合所需的时间。集合文字越长,性能就越差,即使测试的项目不是集合的成员。如果您只想创建一个集来测试成员资格一次,那么最好使用一个元组。如果您需要进行多次测试,则首选该测试集。感谢您的解释。老实说,我没有意识到你可以在2.7中使用
{}
创建一个集合,正如你所说的,用集合进行成员资格测试的含义要令人满意得多!我做了一些计时,发现在集合文本中测试成员身份比在元组文本中测试成员身份要慢。这可能是由于创建集合所需的时间。集合文字越长,性能就越差,即使测试的项目不是集合的成员。如果您只想创建一个集来测试成员资格一次,那么最好使用一个元组。“如果您需要测试多次,则首选该集。@史蒂文鲁姆巴斯基,很高兴您进行了测试——我也这么怀疑。关键是,正如Jon Clements在上文中所说,“元组的初始化(至少在CPython中)产生的字节码比列表少。”不仅仅是元组产生的时间比集合长;这是因为元组在编译时只生成一次,然后作为常量写入字节码——当然,这是可能的,因为元组是不可变的。然而,还有另一个复杂问题:如果元组包含可变值,则不会发生常量折叠。@senderle+1非常有趣,我想知道元组的不可变性是否会影响性能。我猜我们在这里看到的性能提升在大多数情况下都是微不足道的,但我确实想知道幕后发生了什么@senderle:我刚刚测试了使用变量而不是常量创建集合和元组文本。元组的性能优势略有下降,但并未消失。我无法使用可变值测试
set
,因为它们不可散列。
if x in set([1,2,3]):
    pass # do something