【问题标题】:Python 3 side effects of list? [duplicate]列表的 Python 3 副作用? [复制]
【发布时间】:2018-06-21 02:57:00
【问题描述】:

我是 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 行,也没有重新分配 zipped。我所能做的就是该列表有一些奇怪的意外副作用。有经验的人能解决这个问题吗?

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

【问题讨论】:

    标签: python python-3.x list


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      list(zipped) 迭代 zipped,所以当你执行 l1, l2 = zip(*zipped) 时,zipped 是空的,所以你只需执行 l1, l2 = zip()zip() 返回一个长度为 0 的空生成器,而你期望 2 (l1, l2)。

      【讨论】:

        猜你喜欢
        • 2017-07-03
        • 2019-05-23
        • 2012-02-13
        • 2014-07-22
        • 2019-10-10
        • 2013-04-22
        • 2020-06-23
        • 2021-11-18
        • 1970-01-01
        相关资源
        最近更新 更多