生成器到列表的python片分配

生成器到列表的python片分配,python,list,slice,Python,List,Slice,输出: my_list = [1, 2] def f(): print my_list yield 11 print my_list yield 22 print my_list my_list[:] = f() print "finally ", print my_list 我所期望的是: [1, 2] [1, 2] [1, 2] finally [11, 22] 有人曾经告诉我,切片任务已经到位。显然不是。是否有一种优雅的方法来实现它?切片

输出:

my_list = [1, 2]

def f():
    print my_list
    yield 11
    print my_list
    yield 22
    print my_list

my_list[:] = f()

print "finally ",
print my_list
我所期望的是:

[1, 2]
[1, 2]
[1, 2]
finally  [11, 22]

有人曾经告诉我,切片任务已经到位。显然不是。是否有一种优雅的方法来实现它?

切片分配已经到位,但直到整个生成器被消耗后,分配才会发生。它不会一次为列表分配一个元素。它把它们全部读出来,然后立刻把它们全部放到列表中

(请注意,它必须这样做,因为即使序列的长度与原始片段的长度不同,您也可以将序列分配给片段。您可以这样做,例如,
x[2:3]=[1,2,3,4,5,6]
。一次替换一个元素是无法做到这一点的,因为在旧切片和替换它的新序列之间没有一对一的映射。)


没有一种方法可以通过切片分配实现您想要的,因为切片分配总是以这种一次完成的方式工作。您必须并行地迭代列表和生成器,并一次替换一个单独的元素。

可以这样做,但不能直接这样做

考虑:

[1, 2]
[11, 2]
[11, 22]
finally [11, 22]

当然,按照编写的方式,列表将比原始列表或生成器中的元素更短

@BrenBarn您确定应该从“切片”编辑到“拼接”吗?是的(或者更确切地说,从“拼接”编辑到“切片”)。例如,请参见右侧的文档,它是“就位”的,意思是将列表放入我的“就位”列表中,但将生成器消耗到临时列表中有点违背了“就位”的目的。谢谢,有道理。
my_list = [1,2,3,4]

def f():
    print 'first: ', my_list
    yield 11
    print 'second:', my_list
    yield 22
    print 'third: ', my_list        

def inplace(l, func):
    gen=func()
    for i,x in enumerate(l):
        try:
            l[i]=gen.next()
        except StopIteration:
            if i<len(l):
                del l[i:]
            break     

inplace(my_list,f)

print     "final: ", my_list
first:  [1, 2, 3, 4]
second: [11, 2, 3, 4]
third:  [11, 22, 3, 4]
final:  [11, 22]