簡體   English   中英

將數組解包為 zip function 參數

[英]Unpacking array as a zip function argument

我在 python 旅程中遇到了某種問題。 根據Python 迭代器和 zip帖子,upvoded 答案說:

*[iter(a)] * 2

是一樣的東西

 *[iter(a), iter(a)]

我認為這似乎不正確。 例如:如果我在第一種情況下使用 zip function:迭代器的 memory 位置將相同,因此數組 a 將分組為兩個項目的元組。

在第二種情況下,兩個相同的 arrays 將被壓縮。 這是為什么? 流量是多少。 在我看來,在第一種情況下,iter 方法被調用一次,然后它被復制到列表中的第二個位置。

在第二種情況下,iter 方法iter被調用了兩次。 這是我的一段代碼:

a = list(range(10))

def zippo(a, b):
    temp = []
    x1 = iter(a)
    x2 = iter(b)
    while True:
        try:
            item_1 = next(x1)
            item_2 = next(x2)
            temp.append((item_1, item_2))
        except StopIteration:
            break
    return temp


def iter_returner(lis_t):
    temp = iter(lis_t)
    print(temp)
    return temp


print(zippo(*[iter_returner(a)] * 2))
print(zippo(*[iter_returner(a), iter_returner(a)]))

這是 output:

<list_iterator object at 0x000001BC11A70FD0>
[(0, 1), (2, 3), (4, 5), (6, 7), (8, 9)]
<list_iterator object at 0x000001BC11A70FD0>
<list_iterator object at 0x000001BC11A70FA0>
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9)]

我的想法正確嗎? 這兩種情況下的流程是什么?

iter(a)在 a 上返回一個新的、可變a 、獨立於現有迭代器的迭代器。

some_list * some_integer返回一個新列表,其中包含重復some_integer次的some_list的項目。 不復制可變對象,但新列表的多個條目將指向完全相同的 object。

zip(*[iter(a), iter(a)])等同於zip(iter(a), iter(a)) ,后者等同於zip(a, a) (因為zip在其參數上調用iter ) , 和

for x, y in zip(a, a):
   ...

相當於

for x in a:
   y = x
   ...

另一方面, zip(*[iter(a)] * 2)相當於先執行it = iter(a)然后調用zip(it, it) ,正如您所觀察到的,它基本上拆分了輸入列表成對。

重要的區別在於迭代器是可變對象,並且在迭代器上調用next會改變該迭代器。

您為該迭代器指定的名稱無關緊要。

it1 = iter(a)
next(it1)
next(it1)

...做同樣的事情:

it2 = it1 = iter(a)
next(it1)
next(it2)

...但是如果你這樣做:

it1 = iter(a)
it2 = iter(a)
next(it1)
next(it2)

...你有兩個不同的迭代器,它們都只被提升一次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM