Вопрос по python – Поведение генератора Python

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] на самом деле разные.

NOTE: изменение строки

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

это не вариант

просто совет: вы не должны повторно использоватьi как переменная в вашем выражении генератора. Это может привести к путанице. mata

Ваш Ответ

2   ответа
2

Ну, это одна из странных особенностей выражения генератора. Посмотри наэтот В вашем случае он используется с поздним связыванием, и поэтому вы получите два одинаковых результата.

6

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

Variables used in the generator expression are evaluated lazily when the __next__() method is called for generator object (in the same fashion as normal generators). However, the leftmost for clause is immediately evaluated, so that an error produced by it can be seen before any other possible error in the code that handles the generator expression. Subsequent for clauses cannot be evaluated immediately since they may depend on the previous for loop.

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

Похожие вопросы