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))

入力:

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)])

オプションではありません

4

2 に答える 2

6

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

ジェネレーター式で使用される変数は、__next__()メソッドがジェネレーターオブジェクトに対して呼び出されるときに遅延評価されます(通常のジェネレーターと同じ方法で)。ただし、左端のfor句はすぐに評価されるため、ジェネレータ式を処理するコードで発生する可能性のある他のエラーの前に、それによって生成されたエラーを確認できます。後続の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))
于 2012-05-24T08:36:17.503 に答える
2

さて、これはジェネレータ式の奇妙な機能の1つです。これを見て くださいあなたの場合、それは遅延バインディングを使用しているので、2つの同じ結果が得られます。

于 2012-05-24T08:36:29.693 に答える