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