可能是重复(对不起)。我环顾四周,无法找到答案。
我想在单行中生成n
个空字符串列表。
我试过了:
>>> list(str('') * 16)
# ['']
>>> list(str(' ') * 16)
# [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
# anything with a char in it is working
以下有效,但有更好的方法吗?为什么list(str('') * 16)
无效?
>>> [str() for c in 'c' * 16]
['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
答案 0 :(得分:7)
请参阅Python standard types page:
>>> [''] * 16
['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
s * n,n * s
n s连接的浅层副本
其中s
是序列,n
是整数。
此操作文档的完整脚注:
n小于0的值被视为0(产生与s相同类型的空序列)。还要注意副本很浅;嵌套结构不会被复制。这常常困扰着新的Python程序员;考虑:
>>> lists = [[]] * 3
>>> lists
[[], [], []]
>>> lists[0].append(3)
>>> lists
[[3], [3], [3]]
发生的事情是[[]]是一个包含空列表的单元素列表,因此[[]] * 3的所有三个元素都是(指向)这个空列表。修改列表的任何元素都会修改此单个列表。您可以通过以下方式创建不同列表的列表:
>>> lists = [[] for i in range(3)]
>>> lists[0].append(3)
>>> lists[1].append(5)
>>> lists[2].append(7)
>>> lists
[[3], [5], [7]]
答案 1 :(得分:3)
您可以将这样的列表相乘。由于''
不可变,因此您无需担心它们都是对同一字符串的引用。
[''] * 16
你不能对可变对象使用相同的技巧(例如列表或dicts)。您需要使用类似上一版本的内容
[mutable_thing() for c in range(16)]
或
[[] for c in range(16)]
或
[{} for c in range(16)]