2016-05-15 11 views
0

Kann jemand bitte erklären, was vor sich geht?Liste Verständnis gegen Tupel von Sets

>>> xx = ({1,2}, {2,3}, {3,4}, {4,2}) 
>>> yy = [x.discard(2) for x in xx] 
>>> yy 
[None, None, None, None] 
>>> xx 
({1}, {3}, {3, 4}, {4}) 
>>> id(xx) 
4315823704 
>>> id(yy) 
4315797064 

Ich würde yy, um gleich [{1}, {3}, {3, 4}, {4}] und xx zu bleiben unberührt erwartet!

+5

Warum würden Sie das erwarten? 'discard' entfernt das Element von' x', es gibt nichts zurück. – vaultah

+0

@vaultah Wenn ich die Liste Verständnis erweitern out Ich hätte gedacht, es würde sich wie folgt verhalten: 'yy = [] für y in xx: y = y.discard (2) yy.append (y)' – Pynoable

+1

Sie können nicht erwarten, dass ein Listenverständnis Ihnen Ergebnisse zurückgibt, wenn Sie etwas an Ort und Stelle ändern - nur der Rückgabewert wird als Ergebnis protokolliert. Sie müssen eine neue Kopie der Wörterbücher mit den gefilterten Elementen erstellen und diese zurückgeben. Verwende also nicht "discard". –

Antwort

1

das Ergebnis zu erhalten, die Sie möchten, können Sie eine Liste Verständnis der Form verwenden:

yy = [x - {2} for x in xx] 

Zum Beispiel:

>>> xx = ({1,2}, {2,3}, {3,4}, {4,2}) 
>>> yy = [x - {2} for x in xx] 
>>> yy 
[{1}, {3}, {3, 4}, {4}] 
>>> xx 
({1, 2}, {2, 3}, {3, 4}, {2, 4}) 

Ihr ursprüngliches Beispiel verhält sich wie folgt:

>>> xx = ({1,2}, {2,3}, {3,4}, {4,2}) 
>>> yy = [] 
>>> for x in xx: 
... # Here, x is a reference to one of the existing sets in xx. 
... # x.discard modifies x in place and returns None. 
... y = x.discard(2) 
... # y is None at this point. 
... yy.append(y) 
... 
>>> yy 
[None, None, None, None] 
>>> xx 
({1}, {3}, {3, 4}, {4}) 
+0

oder nur '[x - {2} für x in xx]'. – vaultah

Verwandte Themen