为什么在函数中产生一个项目会产生与打印项目不同的输出?

时间:2016-06-27 18:46:42

标签: python yield

我写了这个函数来读取代表数字的单词列表,并用乘数对1-9位数。

def listpairs(element):
    pair = []
    for word in enumerate(element):
        pair.append(word[1])
        if word[1] in denoms:
            yield pair
            pair.clear()
        if word[1] in digits and word[0] == (len(element)-1):
            yield pair

当我尝试使用测试字符串时,它会给出:

list(listpairs('two hundred three ten four'.split())
[['four'], ['four'], ['four']]

如果我用print(pair)替换yield,它会给出预期的输出:

['two', 'hundred']
['three', 'ten']
['four']

为什么会这样?屈服是错误的工具吗?

1 个答案:

答案 0 :(得分:1)

解决方案

你一直在产生相同的名单。替换:

pair.clear()

使用:

pair = []

获取新名单。

示例:

from string import digits
denoms = ['hundred', 'ten']

def listpairs(element):
    pair = []
    for word in enumerate(element):
        pair.append(word[1])
        if word[1] in denoms:
            yield pair
            pair.clear()
        if word[1] in digits and word[0] == (len(element)-1):
            yield pair

list(listpairs('two hundred three ten four'.split()))

给出:

[['four'], ['four']]

可是:

from string import digits

denoms = ['hundred', 'ten']

​

def listpairs(element):
    pair = []
    for word in enumerate(element):
        pair.append(word[1])
        if word[1] in denoms:
            yield pair
            pair = []
        if word[1] in digits and word[0] == (len(element)-1):
            yield pair


list(listpairs('two hundred three ten four'.split()))

结果int:

[['two', 'hundred'], ['three', 'ten']]

解释

虽然mylist.clear()从列表中删除了所有内容,但它仍然是相同的列表。产生相同的列表会导致在输出中多次使用相同的列表。 另一方面,作业mylist = []创建一个新列表,重用名称mylist。在此处重复使用该名称是正确的,因为您产生了列表,即它将在函数之外。