在Python中,如果我将对象列表乘以整数,我会得到一个对该对象的引用列表,例如:
>>> a = [[]] * 3
>>> a
[[], [], []]
>>> a[0].append(1)
>>> a
[[1], [1], [1]]
如果我想要的行为是创建原始对象的副本列表(例如,通过“copy.copy()”方法或某种标准创建的副本,是否有优雅方式使用相同的乘法运算符执行此操作?或者我应该坚持使用列表推导还是其他什么?例如
[[] for x in range(0,3)]
任何版本的Python都可以。
答案 0 :(得分:11)
这是列表理解的一个很好的用法 - 它也是IMO最可读的方式。
所以你建议的[[] for x in range(0,3)]
不是乘法运算符,而是得到你想要的结果。
答案 1 :(得分:4)
序列上的乘法运算符意味着重复项目 - 不创建项目的副本(浅或深)。没有什么可以阻止你发疯,la:
import copy
class Crazy(object):
def __init__(self, body, weird=copy.copy):
self.gomez = body
self.cousinitt = weird
def __mul__(self, n):
return [self.cousinitt(x) for x in (self.gomez * n)]
a = Crazy([[]]) * 3
......除了你的理智和常识,如果有的话。检查那些,你梦寐以求的操作符*
如何能够表达与其意图完全不同的东西,除非通过以奇怪的方式定义另一个类重载__mul__
......? - )
答案 2 :(得分:1)
列表理解是执行此操作的最佳方式。如果你定义一个新的类并重载*运算符,它将严重混淆下一个人阅读代码。