>>> iterable = range(12)
>>> a_list = [iter(iterable)] * 4
>>> [[next(l) for l in a_list] for i in range(3)]
[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]]
我们可以看到a_list包含四次相同的范围迭代器:
>>> a_list
[<range_iterator object at 0x7fde73a5da20>, <range_iterator object at 0x7fde73a5da20>, <range_iterator object at 0x7fde73a5da20>, <range_iterator object at 0x7fde73a5da20>]
可变项目
我已经使用Python很长时间了,我很少看到用可变对象执行上述操作的用例。
相反,要获得,比如说,一个可变的空列表、集合或字典,你应该这样做:
list_of_lists = [[] for _ in columns]
下划线在这种情况下只是一个一次性变量名。
如果你只有数字,那就是:
list_of_lists = [[] for _ in range(4)]
_并不特别,但如果您不打算使用该变量并使用任何其他名称,您的编码环境样式检查器可能会抱怨。
将不可变方法与可变项一起使用的注意事项:
小心使用可变对象执行此操作,当你改变其中一个时,它们都会改变,因为它们都是相同对象:
foo = [[]] * 4
foo[0].append('x')
foo现在返回:
[['x'], ['x'], ['x'], ['x']]
但是对于不可变对象,你可以让它工作,因为你改变了引用,而不是对象:
>>> l = [0] * 4
>>> l[0] += 1
>>> l
[1, 0, 0, 0]
>>> l = [frozenset()] * 4
>>> l[0] |= set('abc')
>>> l
[frozenset(['a', 'c', 'b']), frozenset([]), frozenset([]), frozenset([])]