用Python创建重复n次的单项列表
不变项目
对于不可变的项,如None、String、tuple或Frozenset,您可以这样做:[e] * 4
请注意,这最好仅用于列表中的不可变项(字符串、元组、冻结集),因为它们都指向内存中相同位置的相同项。当我必须构建一个包含所有字符串的模式的表时,我经常使用它,这样我就不必给出一个一对一的映射。schema = ['string'] * len(columns)
可变项目
我已经使用Python很长时间了,我从来没有见过用例可以用可变的实例来完成上面的操作。相反,要获得一个可变的空列表、SET或DICT,您应该这样做:list_of_lists = [[] for _ in columns]
下划线只是这个上下文中的一个抛出的变量名。
如果你只有这个号码,那就是:list_of_lists = [[] for _ in range(4)]
这个_并不是很特别,但是如果您不打算使用变量并使用任何其他名称,您的编码环境样式检查器可能会抱怨。
对可变项使用不可变方法的注意事项:
请注意使用可变对象进行此操作。,当你改变其中一个,它们都会改变,因为它们都是同目的:foo = [[]] *4foo[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([])]
但同样,可变对象对此没有好处,因为就地操作会更改对象,而不是引用:l = [set()] * 4>>> l[0] |= set('abc') >>> l[set(['a', 'c', 'b']), set(['a', 'c', 'b']), set(['a', 'c', 'b']), set(['a', 'c', 'b'])]