2012-09-13 40 views
5

我想知道在python if statments中是否有任何好的理由讓列表優先於元組,反之亦然。因此,以下是功能上等同的,但在性能和編碼風格方面比另一方更可取或者不重要?在Python中使用列表和元組if

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

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

我似乎已經卷入瞭如果有2個或3個值,並列出了更長的東西使用的元組的習慣,我想是因爲我的經驗,元組往往是短名單很長,但是這似乎是一個有點任意,可能不必要地不一致。

我會對任何人可以給出的例子都會比另一個更好的例子感興趣。

乾杯

+3

設置是在這裏更好 – GP89

+0

[列表和元組之間的區別]可能的誘惑(http://stackoverflow.com/questions/626759/whats-the-difference-between-list-and-tuples-in-python )或[python列表與元組何時使用每個](http://stackoverflow.com/questions/1708510/python-list -vs元組-時使用的-每個)。 – DSM

+0

@ GP89:謹慎地闡述? – voithos

回答

5

一個tuple(至少在CPython的)的初始化到陣列產生較少的字節碼比list - 但它真的沒什麼可擔心的。我相信會員資格測試幾乎是一樣的(雖然沒有測試過)。

對於純粹的成員資格測試,查找語義是相同的。從Python 2.7版開始,它更漂亮寫(並增加了一個含義,它的成員僅測試):

if x in {1, 2, 3}: 
    pass # do something 

雖然之前,要:

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

只是看着有點缺憾......

+0

感謝您的解釋。說實話,我還沒有意識到你可以在2.7中使用'{}'創建一個集合,正如你所說的,使用集合進行成員測試的含義更令人滿意! – redrah

+1

我做了一些計時,發現測試集合文字中的成員資格比測試元組文字中的成員資格要慢*。這可能是由於創建該組所需的時間。即使所測試的項目不是該集合的成員,集合字面值越長,則表現越差。結論是,如果你打算創建一個集合來測試一次會員資格,那麼你最好用一個元組。如果您需要多次測試,那麼該設置是首選。 –

+1

@StevenRumbalski,很高興你測試了這個 - 我也懷疑過。關鍵是,正如喬恩克萊門茨上面所說的,「元組的初始化(至少在CPython中)產生的字節碼比列表少。」不僅僅是產生一個元組比花費更長的時間,它是在編譯時只生成一次元組,然後[摺疊](http://en.wikipedia.org/wiki/Constant_folding)作爲常量存儲到字節碼中 - 當然,這是可能的,因爲元組是不可變的。然而,還有另一個複雜性:如果元組包含可變值,則常量摺疊_不會發生。 – senderle

0

列表和元組之間的區別是,列表是可變的,元組是不可改變的。

人們傾向於使用異質集合的元組,類似於在C結構,並列出是用於均質集合,類似於C.