【问题标题】:Python generator behaviourPython 生成器行为
【发布时间】:2012-05-30 19:31:23
【问题描述】:
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)])

不是一种选择

【问题讨论】:

  • 只是一个建议:你不应该在你的生成器表达式中重用i 作为变量。这可能会导致混乱。

标签: python iterator generator


【解决方案1】:

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

生成器表达式中使用的变量在以下情况下被延迟计算 为生成器对象调用__next__() 方法(在同一 像普通发电机一样时尚)。但是,最左边的 for 子句是 立即评估,以便可以看到它产生的错误 在处理生成器的代码中出现任何其他可能的错误之前 表达。无法立即评估后续 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))

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2016-08-28
      • 2015-11-07
      • 2011-12-19
      • 2014-10-21
      • 2020-04-07
      • 2013-10-02
      • 2011-04-17
      • 2019-04-19
      相关资源
      最近更新 更多