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

嗯,这是生成器表达式的奇怪特征之一。看看这个 在你的情况下,它使用后期绑定,这就是为什么你会得到两个相同的结果。

于 2012-05-24T08:36:29.693 回答