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