2013-12-15 89 views
1

例如(從實際的使用大大簡化):Python:有沒有辦法讓所有對象的引用都引用另一個對象?

我爲10,000引用到3個對象的一個​​列表:

a,b,c = {'font-size':1},{'font-size':2},{'font-size':2.3}` 
styles = [a,b,c,a,a,a,a,a,b,......] #10,000 

這節省了我的每創建一個新的字典的記憶10000個指標,因爲它們都屬於三種價值之一(實際上有數百種)。

現在我決定字體大小必須是int,所以我圍繞c{'font-size':2}。但我希望所有c變成b,因爲它們現在是同一個。

有沒有一種方法(對整個列表進行徹底的比較,並比較每個值並在需要時將其替換,我知道它,但是如果我必須再次對很多對象再次執行,則會變得很慢),以使所有參考c參考b?我知道python保留垃圾清理這樣的引用列表。或者也許c引用的對象可以依次自動引用b

編輯:我欣賞建議的解決方法,但正如在評論中所述,解決方法都讓我遇到問題,我希望通過找到問題答案(改變內存消耗或時間消耗)通過Python引用列表引用或以某種方式在python內部重定向引用)。

+0

呢'C = B'做出任何幫助嗎? –

+1

不,因爲在'styles'中它仍然指'c',即'styles [2]是b == False' – Jeff

+1

據我所知,你所要求的是不可能的。 – mgilson

回答

0

重新分配c的值,然後重新分配的樣式

c = b 
styles = [a,b,c,a,a,a,a,a,b,......] #10,000 

則C將指b中的值。這是一個解決方案,我能想到的

>>> a = [1,2,3] 
>>> b = [2,3,4] 
>>> c = [a,b] 
>>> b = a 
>>> c[1] 
[2, 3, 4] 
>>> b 
[1, 2, 3] 
>>> c = [a,b] 
>>> c[1] 
[1, 2, 3] 
+1

如前所述,缺少風格和比較每個值,我不知道如何分配樣式。它在某個早期點被分配了值,在程序的其他地方,現在需要改變。我不能只做'styles = [.....]' – Jeff

+0

@Jeff:如果樣式是在某個函數中賦值的,那麼可以再次調用該函數,也許是 –

+0

'c = [a,b]'(第二個到最後的聲明)? – falsetru

2

如何使用索引styles

template = a, b, c = {'font-size':1},{'font-size':2},{'font-size':2.3}` 
#styles = [a,b,c,a,a,a,a,a,b,......] 
styles = [0,1,2,0,0,0,0,0,1,......] 

c['font-size'] = 2 
# OR template[2]['font-size'] = 2 
# OR template[2] = template[1] 

缺點:

其他非關聯化需要訪問的實際值:template[styles[i]]代替styles[i]

+0

我喜歡'#OR template [2] = template [1]''的方法,但是我經常需要通過'styles'來知道每個相鄰樣式是否與前一樣相同如果(如您所指出的)每次都必須將2對1解引用,則會變得緩慢。 – Jeff

+1

@Jeff,如果'styles = [1 if i == 2 else i for i in styles]'或'styles [:] = [1 if i == 2 else i for i in styles]',只檢查索引,而不是內容? – falsetru

+0

可能更快,那麼我的後備'for'循環,因爲使用列表理解。 (並且可以使用索引和'=='來刪除:'styles = [b if i is c else i for i in styles]',)我仍然堅持另一個不涉及重寫整個列表的答案雖然。 – Jeff

0

我不知道我的理解,但如果你只有三種風格,你想取代以往b在使用C風格的Y的發生,你可以這樣做:

a,b,c = {'font-size':1},{'font-size':2},{'font-size':2.3} 
styles = [a,b,c,a,a,a,a,a,b,c,a] 
for n,i in enumerate(styles): 
    if i==b: 
    styles[n]=c 
print styles 

>>>[{'font-size': 1}, {'font-size': 2.3}, {'font-size': 2.3}, ... 
+0

如上所述,「沒有徹底清單並比較每個值並在需要時將其替換,我知道這些值,但是如果我必須再次對多個對象再次執行,則速度很慢」# – Jeff

0

什麼

a, b, c = the_values = [{'font-size': 1}, {'font-size': 2}, {'font-size': 2.3}] 
styles = [a, b, c, a, a, a, c, a, a, b, b, c] 
# and now: 
c['font-size'] = 2 
the_values_immutable = [tuple(d.items()) for d in the_values] 
reduced = set(the_values_immutable) 
mapping = { itmtup: dict(itmtup) for itmtup in reduced } 
new_styles = [mapping[tuple(d.items())] for d in styles] 

這將創建代表每個字典元組的列表。然後通過設置算術來減少它。

結果是包含全新對象的樣式列表。

如果你喜歡有一些保留任何原因,舊的項目,你最好更換

mapping = { itmtup: dict(itmtup) for itmtup in reduced } 

的東西看起來了每個項目的老the_values列表。

如果您必須經常這樣做,並且希望儘可能多地減少它,則應該添加一個間接級別。

在這種情況下見falsetru's answer

+0

這是否比使用編輯:我認爲你的編輯(「一層間接......」)和他的回答是一樣的,如果我理解正確的話,在這種情況下,請看我對他的回答的第一個評論。 – Jeff

+0

@Jeff這取決於你多久這樣做,如果你有兩個具有相同內容的對象,它真的會受傷嗎?也許你應該堅持一個每個文本區域在概念上都是相同的,如果兩個樣式在物理上是相同的,它們保持合法的方式,並且在需要時可以再次一起更改 – glglgl

0

由於c是一個容器,您可以清空它,然後將其中的項目從b複製到它。這可能會少於潛在更改styles中的10,000個條目的工作。

a,b,c = {'font-size':1},{'font-size':2},{'font-size':2.3} 
styles = [a,b,c,a,a,a,a,a,b,] 

c.clear() 
for k in b: 
    c[k] = b[k] 

print styles 

輸出:

[{'font-size': 1}, {'font-size': 2}, {'font-size': 2}, {'font-size': 1}, 
{'font-size': 1}, {'font-size': 1}, {'font-size': 1}, {'font-size': 1}, 
{'font-size': 2}] 
+0

因爲我會做很多很多次大的物體,正如我所說的,我在尋找爲了節約內存,我不想讓大量的容器完全相同。此外,這是一個解決方法,我很欣賞,但它並沒有真正回答這個問題。 – Jeff

+0

我知道它不回答你的問題,是一種解決方法。但是,它不會創造更多的容器 - 現在只有三個容器。它只是改變了其中一個的內容。 – martineau

+0

對不起,我忘了添加上下文。你是對的,但我有更多更大的容器,並且不斷創建新的容器(例如){font-size:3},然後將它們更改爲font-size:2,再次創建一個新副本同樣的事情。它也發生在我身上,我經常只想改變字體大小的一些*:2到3,所以我不能只是替換內容。 – Jeff

相關問題