python将生成器分配给列表

rob*_*ing 3 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
Run Code Online (Sandbox Code Playgroud)

输出:

[1, 2]
[1, 2]
[1, 2]
finally  [11, 22]
Run Code Online (Sandbox Code Playgroud)

我的期望是:

[1, 2]
[11, 2]
[11, 22]
finally [11, 22]
Run Code Online (Sandbox Code Playgroud)

有人曾告诉我切片分配到位.显然不是.是否有一种优雅的方式来实现它?

Bre*_*arn 7

切片分配就位,但在整个生成器消耗之前不会进行分配.它不会一次为列表分配一个元素.它会全部读取它们,然后立即将它们全部放入列表中.

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

没有办法通过切片分配来实现您想要的效果,因为切片分配总是以这种一次性方式工作.您必须并行迭代列表和生成器,并逐个替换单个元素.