Python生成器行为

时间:2012-05-24 08:23:01

标签: python iterator generator

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

不是一个选项

2 个答案:

答案 0 :(得分:6)

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

  

生成器表达式中使用的变量在延迟时进行评估   为生成器对象调用__next__()方法(同样   时尚作为正常的发电机)。但是,最左边的for子句是   立即评估,以便可以看到它产生的错误   在处理生成器的代码中的任何其他可能的错误之前   表达。条款的后续内容无法立即评估   因为它们可能依赖于之前的for循环。

执行生成器时会评估

S[i:j+1],此时S具有最新值。

您可以使用普通发电机。现在sssubgen的本地人:

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 在你的情况下,它使用后期绑定,这就是为什么你会得到两个相同的结果。