2009-10-22 45 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

列表內涵是最好的這樣做的方法。如果你定義了一個新類並且超載了*運算符,那麼它將嚴重混淆下一個人閱讀代碼。