python解释器有多聪明?

时间:2012-08-30 02:50:38

标签: python

可能是一个愚蠢的问题,但我总体上想知道,如果有人知道,Python解释器有多远见,特别是在正则表达式和文本解析领域。

假设我的代码在某些时候看起来像这样:

mylist = ['a', 'b', 'c', ... ]

if 'g' in list: print(mylist.index('g'))

有没有更安全的方法来使用while循环或类似方法。我的意思是,索引是从头开始用第二个解析来查找的,还是两个g(在上面的行中)在Python的脑海中是同样的东西?

6 个答案:

答案 0 :(得分:4)

它会同时进行查找。如果它值得(例如,一个非常大的列表),请使用try

try:
    print(mylist.index('g'))
except ValueError:
    pass

答案 1 :(得分:4)

包含检查的结果不会被缓存,因此需要重新发现索引。并且Python的动态特性使得这种事物的隐式缓存不可靠,因为__contains__()方法可能会改变对象(尽管这样做会违反几个编程原则)。

答案 2 :(得分:1)

您的代码将导致两次查找,首先确定“g”是否在列表中,第二次查找索引。 Python不会尝试将它们合并为单个查找。如果您担心效率,可以使用字典而不是列表,这将使查找O(1)而不是O(n)。

答案 3 :(得分:1)

你可以轻松地制作一个词典来查找。像这样:

mydict = {k:v for v,k in enumerate(mylist)}

创建dict的开销不值得,除非您在同一list

上进行一些此类查找

答案 4 :(得分:0)

尝试查找列表中元素的索引是更好的选择。 尝试:     打印(mylist.index( 'G')) 除了ValueError:     打印“值不在列表中”
    通

答案 5 :(得分:0)

是的,它会被查找两次,python解释器不会缓存指令,虽然我想知道它是否可能(对于某些事情),如果这是一个问题,那么你可以使用setsdicts两者都有不断的查找时间。

无论哪种方式,你似乎都是LBYL,在python中我们倾向于EAFP所以在try ... except块中包装这些东西很常见