http://docs.python.org/reference/expressions.html#generator-expressions
Переменные, используемые в выражении генератора, оцениваются лениво, когда Метод
blockquote>__next__()
вызывается для объекта генератора (таким же образом, как и обычные генераторы). Тем не менее, крайнее левое предложение немедленно оценивается, так что полученная им ошибка может быть видна перед любой другой возможной ошибкой в коде, который обрабатывает выражение генератора. Последующие предложения не могут быть сразу оценены, так как они могут зависеть от предыдущего цикла цикла.
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))