Python 3列表的副作用?

时间:2018-01-11 17:30:58

标签: python python-3.x list

我是python的新手并且正在测试解压缩(因为我读它在python 3中不起作用)。但发现这个奇怪的事情:

l1="abcd"
l2="1234"
zipped=zip(l1,l2)
#print(l1,l2,list(zipped))
l1,l2=zip(*zipped)
print(l1,l2)

打印('a', 'b', 'c', 'd') ('1', '2', '3', '4')

l1="abcd"
l2="1234"
zipped=zip(l1,l2)
print(l1,l2,list(zipped))
l1,l2=zip(*zipped)
print(l1,l2)

创建错误:Traceback (most recent call last): File "python", line 5, in <module> ValueError: not enough values to unpack (expected 2, got 0)

但是我甚至没有改变第5行,也没有重新分配拉链。我能做的就是这个列表有一些奇怪的意想不到的副作用。更有经验的人可以清楚这一点吗?

编辑:我检查了列表是否通过插入额外的print(zipped)将zip对象转换为列表,但它打印了<zip object at 0x7f993c85af48>。我现在怀疑它与repl.it有一些关系。

2 个答案:

答案 0 :(得分:2)

Python 3中的

zip变成了一个生成器,意味着它不会立即生成一个潜在的巨大结果列表,而是逐个生成。结果是:内存使用量减少。缺点:你通过调用它周围的列表(...)来耗尽你的生成器,因为它消耗了所有生成的元素。因此错误。如果您愿意,将生成的列表传递到下一行。

答案 1 :(得分:0)

list(zipped)遍历zipped,因此当您执行l1, l2 = zip(*zipped)时,zipped为空,因此您只需执行l1, l2 = zip()zip()当你期望2(l1, l2)时,返回一个长度为0的空生成器。