为什么这个python生成器会像这样?

时间:2019-12-09 05:09:42

标签: python generator

class GroupMemberSerializer(serializers.ModelSerializer):
    class Meta:
        model = GroupMember
        fields = "__all__"

class GroupSerializer(serializers.ModelSerializer):
    class Meta:
        model = Group
        fields = "__all__"

为什么打印输出为def upto(n): items = [] for i in range(n): items.append(i) yield items print(list(upto(2))) ?当我在upto(2)上两次调用next时,第一次是[[0,1],[0,1]],第二次是yields [0],所以结果不应该是[0,1]吗?

3 个答案:

答案 0 :(得分:2)

您需要出示副本yield items[:]

答案 1 :(得分:0)

In [1]:

def upto(n):
    items = []
    for i in range(n):
        items.append(i)
        yield items.copy()

list(upto(2))

Out[1]: [[0], [0, 1]]

答案 2 :(得分:0)

问题是,当您尝试在生成器上调用list方法时,您引用的是同一列表(按引用列出工作)。您产生的列表在每次循环时都会更新。因此,当您列出生成器时,它会得到更新的列表。要获得所需的内容,您可以执行以下两项操作之一,

  1. 每次循环浏览时都会产生一个新列表,例如yield items[:]
  2. 通过返回的生成器进行迭代,例如 for i in upto(2):     print(i) # here,each time it gets the current one