【发布时间】:2019-03-30 22:27:39
【问题描述】:
我尝试创建以下代码:
class Test(object):
def __init__(self, arg):
self.arg1 = arg + 1
self.arg2 = arg + 2
self.arg3 = arg + 3
def __iter__(self):
return self
def __next__(self):
yield self.arg1, self.arg2, self.arg3
test_list = [Test(0), Test(1), Test(2)]
for arg1, arg2, arg3 in test_list:
print('arg1', arg1, 'arg2', arg2, 'arg3', arg3)
但是当我尝试运行时,python 说:
Traceback (most recent call last):
File "test.py", line 20, in <module>
for arg1, arg2, arg3 in test_list:
ValueError: too many values to unpack (expected 3)
我可以通过手动打开包装来解决它:
class Test(object):
def __init__(self, arg):
self.arg1 = arg + 1
self.arg2 = arg + 2
self.arg3 = arg + 3
test_list = [Test(0), Test(1), Test(2)]
for test in test_list:
arg1, arg2, arg3 = test.arg1, test.arg2, test.arg3
print('arg1', arg1, 'arg2', arg2, 'arg3', arg3)
我们怎样才能解压python列表中的对象而不像解决方法演示的那样显式地解压?对于最后一个示例,结果如下:
arg1 1 arg2 2 arg3 3
arg1 2 arg2 3 arg3 4
arg1 3 arg2 4 arg3 5
【问题讨论】:
-
忽略产量问题,这种迭代的使用是不寻常的。它产生相同值(2)的无限重复(1),这两个事实共同掩盖了每次迭代使用相同的迭代器。这对于其他所有用法都是一个错误。
标签: python iterator generator python-3.6 iterable-unpacking