Python生成器行为

pro*_*ngs 2 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))
Run Code Online (Sandbox Code Playgroud)

输入:

2
aab
aac
Run Code Online (Sandbox Code Playgroud)

现在无论subs[0]subs[1]给我同样的结果.

print list(subs[0])
>>>['a','aa','aac','a','ac','c']
print list(subs[1])
>>>['a','aa','aac','a','ac','c']
Run Code Online (Sandbox Code Playgroud)

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))
Run Code Online (Sandbox Code Playgroud)

subs.append([S[i:j+1] for i in xrange(l) for j in xrange(i,l)])
Run Code Online (Sandbox Code Playgroud)

不是一种选择

Jan*_*ila 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))
Run Code Online (Sandbox Code Playgroud)