在Python if语句中使用列表和元组
我想知道在python在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个值和更长的列表,我认为,因为根据我的经验,元组往往很短,列表很长,但这似乎有点武断,可能不必要的不一致 我对人们能给出的任何一个例子都感兴趣,其中一个比另一个好
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