为了让我的程序看起来更美观而不是丑陋,我试图寻找一种更Pythonic的方法将单个值多次添加到列表中。我现在使用循环,但我创建了一个未使用的变量。
l = []; n = 5; v = 0.5
for i in xrange(n):
l.append(v)
有什么想法吗?
将 v 添加到 l 中,重复 n 次:
l += n * [v]
尝试使用 list.extend
方法和列表乘法运算符来操作列表
l.extend([v] * n)
[v,v,v ...]
列表,重复n
次,如果该值是不可变的,则可以接受,但如果该值是可变的并且您希望它们是独立的,则可能会导致意外行为。 - Gareth Lattyv
是可变对象,则可能会导致不良结果。 - Ashwini Chaudharyv
是可变的,那么应该使用 [v.copy()] * n
。 - Nils Wernern
个引用的列表。 - Gareth Latty__copy __()
是一个好猜测,但不能保证已实现或可能)。问题在于期望 *
重新评估表达式,但它并没有这样做。它只是复制了一个引用。如果您将其视为 new = v.copy()
[new] * n
- 它完全相同。 - Gareth Lattylist.extend()
和一个 生成器表达式。l.extend(generate_value() for _ in range(n))
这将会添加一个值 n
次。请注意,每次这将评估generate_value()
,从而规避其他答案可能存在的可变值问题:
这将会添加一个值 n
次。请注意,每次这将评估 generate_value()
,从而规避其他答案可能存在的可变值问题:
>>> [[1]] * 5
[[1], [1], [1], [1], [1]]
>>> _[0].append(1)
>>> _
[[1, 1], [1, 1], [1, 1], [1, 1], [1, 1]]
>>> [[1] for _ in range(5)]
[[1], [1], [1], [1], [1]]
>>> _[0].append(1)
>>> _
[[1, 1], [1], [1], [1], [1]]
使用乘法方法时,您最终会得到一个包含 n 个对同一列表的引用的列表。当您进行更改时,您会在列表的每个元素中看到更改-因为它们都相同。generate_value()
的替代方案,在大多数情况下,您也可以使用 copy.deepcopy()
。 - Lie Ryancopy.deepcopy()
仅适用于实现了 __deepcopy __()
的对象,这并不是保证。 generate_value()
是一个占位符,旨在表明可以使用任何生成值的东西 - 包括但不限于 copy.deepcopy()
。 - Gareth Latty试试这个
n = 5
v = 0.5
l = [v]*n