python - 尝试解压集合时的 ​​TypeError 与 ValueError

标签 python iterable-unpacking

为什么下面的两个代码片段会产生不同的错误? 我知道字符串是可迭代的,但我不明白为什么这在这里很重要,因为集合是被迭代的对象。

s = set([1, 2])        
for one, two in s:
  print one, two

加注

Traceback (most recent call last):
  File "asdf.py", line 86, in <module>
    for one, two in s:
TypeError: 'int' object is not iterable

s2 = set(['a', 'b'])
for one, two in s2:
  print one, two 

加注

Traceback (most recent call last):
  File "asdf.py", line 90, in <module>
    for one, two in s2:
ValueError: need more than 1 value to unpack

最佳答案

字符串也是一个序列;您可以将字符串解压缩为单独的字符:

>>> a, b = 'cd'
>>> a
'c'
>>> b
'd'

ValueError 被引发是因为长度为 1 的字符串不能被解压成两个目标。

然而,当遍历整数序列时,您试图将每个整数值解包到两个目标中,而整数根本不可迭代。这是一个 TypeError,因为它直接与您尝试解包的对象类型相关:

>>> a, b = 42
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable

将其与字符串、列表、元组、迭代器、生成器等进行比较,这些都是可迭代的类型。

如果您想直接解压集合,请不要使用 for 循环:

>>> a, b = set([1, 2])
>>> a
1
>>> b
2

但要知道集合没有固定顺序(就像字典一样),值的分配顺序取决于集合中插入和删除的确切历史。

关于python - 尝试解压集合时的 ​​TypeError 与 ValueError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21051674/

相关文章:

python - 解压特定索引

python - 当需要使用AsyncIO和ThreadPoolExecutor时,是否需要手动调用loop.close()?

python - 如何在变量中提取字典单键值对

Python 解压命名元组的二维列表

python - 在Python中解压字典并获取值

python - 使用python psycopg2保存二进制数据时如何修复 "can' t adapt error

python - 我可以在没有使用 python 打开实际浏览器的情况下将 selenium 与 Scrapy 一起使用吗

python - 标尺函数的迭代实现 (1,2,1,3,1,2,1,4,1,2,1,3,...)

python - 函数定义与 Lambda 表达式

python - Fedora 17 中的 vpython GdkGLExt-警告