2012-05-24 48 views
2
import itertools 
ws=[] 
subs=[] 
set_subs=[] 
for i in xrange(int(raw_input())): 
    S=raw_input() 
    l=len(S) 
    subs.append(S[i:j+1] for i in xrange(l) for j in xrange(i,l)) 

輸入:Python的發電機行爲

2 
aab 
aac 

現在都subs[0]subs[1]給我同樣的結果。

print list(subs[0]) 
>>>['a','aa','aac','a','ac','c'] 
print list(subs[1]) 
>>>['a','aa','aac','a','ac','c'] 

list(subs[0])應該已經['a','aa','aab','a','ab','b']

我隱約明白爲什麼會這樣。我該怎麼做才能使subs[0]subs[1]實際上有所不同。

:改變所述線

subs.append(S[i:j+1] for i in xrange(l) for j in xrange(i,l)) 

subs.append([S[i:j+1] for i in xrange(l) for j in xrange(i,l)]) 

不是一個選項

+0

只是一個建議:你不應該在生成器表達式中重複使用'i'作爲變量。它可能導致混亂。 – mata

回答

6

http://docs.python.org/reference/expressions.html#generator-expressions

變量使用我當對發電機對象調用 __next__()方法(與通常的發電機採用相同的方式 )時,發電機表達式將被懶惰地評估。但是,最左邊的for子句是立即評估的 ,因此在處理生成器 表達式的代碼中出現任何其他可能的錯誤之前,可能會看到由其產生的錯誤 。後續條款不能立即評估 ,因爲它們可能取決於前面的for循環。當你執行發電機

S[i:j+1]進行評估,並在該點S具有最新的值。

您可以改用普通的發電機。現在ss是本地subgen

import itertools 

def subgen(ss): 
    l=len(ss) 
    for i in xrange(l): 
     for j in xrange(i,l): 
      yield ss[i:j+1] 

subs=[] 
for i in xrange(int(raw_input())): 
    S=raw_input() 
    subs.append(subgen(S)) 
2

好了,這是產生表達的奇怪特徵之一。看看this 在你的情況下,它使用後期綁定,這就是爲什麼你會得到兩個相同的結果。