2009-10-22 24 views
5

在Python中创建对象的副本,如果我用一个整数乘以对象名单,我得到的引用列表到该对象,例如:Python的 - 使用乘法操作符在列表

>>> a = [[]] * 3 
>>> a 
[[], [], []] 
>>> a[0].append(1) 
>>> a 
[[1], [1], [1]] 

如果我希望的行为是创建一个原始对象的副本列表(例如,由“copy.copy()”方法创建的副本或某种标准,有没有优雅的方法来做到这一点与相同的乘法运算符?或者我应该坚持一个列表理解或什么东西?例如

[[] for x in range(0,3)] 

任何版本的Python都可以。

+0

最佳重复目标:[列表的Python列表,更改反映在跨子列表意外](http://stackoverflow.com/q/240178) – 2014-03-21 11:59:55

回答

5

序列上的乘法运算符意味着重复项目 - 不创建项目的副本(浅或深)。没有什么能够阻止你疯了,一个拉:

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__ ... - ?)

+1

虽然我明白你的强调这是怪异的,会不会更容易(和更普遍有用的)从'list'类继承,以便我们为我们完成所有咕噜的列表处理工作,并简单地重载'__mul__'操作符来进行复制? – 2009-10-22 05:31:31

5

这是一个很好的使用列表理解 - 它也是最可读的方式来做它IMO。

1

列表内涵是最好的这样做的方法。如果你定义了一个新类并且超载了*运算符,那么它将严重混淆下一个人阅读代码。