在一行中创建n个空字符串

时间:2014-10-13 04:13:37

标签: python python-2.7

可能是重复(对不起)。我环顾四周,无法找到答案。

我想在单行中生成n个空字符串列表。

我试过了:

>>> list(str('') * 16)
# ['']
>>> list(str(' ') * 16)
# [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
# anything with a char in it is working

以下有效,但有更好的方法吗?为什么list(str('') * 16)无效?

>>> [str() for c in 'c' * 16]
['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']

2 个答案:

答案 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)]