[英]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.