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)])
不是一个选项
答案 0 :(得分: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))
答案 1 :(得分:2)
嗯,这是生成器表达的一个奇怪特性。看看this 在你的情况下,它使用后期绑定,这就是为什么你会得到两个相同的结果。