结合 zip 多次产生 python 参考

Yield a python reference multiple times in combination with zip

我在 numpy 中有一个相当大的数组,并且想将值生成给管道中的下一个处理函数。我已经预先分配了 numpy 数组,因为我不想每次都分配内存。

在一个函数中我必须产生两个值,第一个应该在之后直接使用,第二个在几个管道阶段之后。

代码的简化版本如下所示:

import numpy as np

def numbers():
    ret = np.array([0])
    for i in range(4):
        ret[0] = i
        yield ret

def raw(gen):
    for d in gen:
        yield d

def add_ten(gen):
    for d in gen:
        yield d, d+10

def fun1():
    nums = numbers()
    g1, g2 = zip(*add_ten(nums))
    for n1, n2 in zip(g1, g2):
        print(n1, n2)

def fun2():
    nums = numbers()
    g = raw(nums)
    for n in g:
        print(n)

print("fun1")
fun1()

print("fun2")
fun2()

代码returns以下

fun1
[3] [10]
[3] [11]
[3] [12]
[3] [13]
fun2
[0]
[1]
[2]
[3]

生成器总是生成相同的引用,我只是更改了基础数据。很明显,如果我将数据收集到列表中,我会看到始终相同的值,因为只存储了引用。 但是,我不明白为什么 fun1 中的 g1 不起作用,而 fun2 中的 g 却按预期工作。

编辑: 我很感激这个问题的解决方法。

编辑: 在我的应用程序中,我再次将这些迭代器传递给函数,并在几步之后加入它们。

Thierry 已经有了解决方案,如果我直接使用这些值,谢谢你:)

def fun3():
    nums = numbers()
    g1, g2 = zip(*add_ten(nums))
    h1 = raw(g1)
    h2 = raw(g2)

    for n1, n2 in zip(h1, h2):
        print(n1, n2)

这是因为 *add_ten(nums) 发生在 g1, g2 = zip(*add_ten(nums)) 中。

为了创建解压列表,add_tens 生成器立即耗尽。此列表将作为 zip 的参数,将包含:

(<your array>, <a new array containing 10>),
(<your array>, <a new array containing 11>),
(<your array>, <a new array containing 12>),
(<your array>, <a new array containing 13>),

add_ten 生成。

压缩后,您将拥有:

(<your array>, <your array>, <your array>, <your array>),
(<a new array containing 10>, ... <a new array containing 13>)

当您打印 <your_array> 的内容时,您将获得 4 个参考文献中的每一个的 3,因为这是其当前内容。

fun2 中,当您在迭代的每一步打印数组的内容时,您将获得其连续的内容,因此 0、1、2、3。