2017-07-17 2 views
3

Ich habe eine Konstanten constants.py wie so Datei:Inkonsistenz mit Karte in Python

querystring = { 
    "limit":"10000", 
    "sort":"desc" 
} 

dummy1 = { 
    "a": "22", 
    "q": "*", 
} 

dummy2 = { 
    "a": "24", 
    "q": "**", 
} 

streams = [dummy1, dummy2] 

Ich versuche, eine Liste zu initialisieren, indem die Werte aus der constants.py Datei zu manipulieren.

from constants import querystring, streams 
def setParams(dummy, querystring): 
    ld = {} 
    ld["query"] = setQuerystring(dummy, querystring) 
    print ld 
    return ld 

def setQuerystring(dummy, querystring): 
    query = querystring 
    query["filter"] = "stream:" + dummy["a"] 
    query["query"] = dummy["q"] 
    return query 

l = map(lambda x: setParams(x, querystring), streams) 
print l[0] 
print l[1] 

Während die Lambda-Funktion ausgeführt wird, wird die Ausgabe korrekt gedruckt, aber wenn ich den Endwert sehen von der Karte zurückgeführt, die Werte sind verschieden. Warum diese Inkonsistenz?

Das Programm Ausgabe:

{'query': {'sort': 'desc', 'filter': 'stream:22', 'limit': '10000', 'query': '*'}} # l[0] -> during lambda execution 
{'query': {'sort': 'desc', 'filter': 'stream:24', 'limit': '10000', 'query': '**'}} # l[1] -> during lambda execution 
{'query': {'sort': 'desc', 'filter': 'stream:24', 'limit': '10000', 'query': '**'}} # l[0] -> from map 
{'query': {'sort': 'desc', 'filter': 'stream:24', 'limit': '10000', 'query': '**'}} # l[1] -> from map 
+0

'querystring' in der Tat ist wandelbar' dict'. 'query = querystring' erstellt keine Kopie von dict, sondern verwendet stattdessen eine Referenz. In 'setQuerystring' modifizierst du dieselbe dict-Instanz immer wieder. Versuchen Sie 'query = querystring.copy()' –

Antwort

3

Sie Wiederverwendung und Modifizierung der querystring dict über Iterationen. Spätere Änderungen von aufeinanderfolgenden Iterationen werden daher auf zuvor angehängte Kopien übertragen. Sie sollten stattdessen zu jedem dict betrachten eine Kopie angebracht wird, und geändert wird, kopieren:

def setQuerystring(dummy, querystring): 
    query = querystring.copy() 
    ... 

{'query': {'sort': 'desc', 'filter': 'stream:22', 'limit': '10000', 'query': '*'}} 
{'query': {'sort': 'desc', 'filter': 'stream:24', 'limit': '10000', 'query': '**'}} 
{'query': {'sort': 'desc', 'filter': 'stream:22', 'limit': '10000', 'query': '*'}} 
{'query': {'sort': 'desc', 'filter': 'stream:24', 'limit': '10000', 'query': '**'}} 
+0

Ich war unter der Annahme, dass das Standardverhalten zu kopieren war, nicht das vorhandene Objekt zu ändern. – TheChetan