2016-08-10 2 views
1

ich diese Art von einem Funktionsaufruf in Python habe:die Funktion Argument innerhalb des gleichen Anrufs Referenzierung

foo(["A", "B", "X", "Y", "Z"], SomeClass("m", ["A", "B", "X", "Y", "Z"]), SomeClass("n",["A", "B", "X", "Y", "Z"])) 

Im Allgemeinen kann foo beliebige Anzahl von Argumenten haben, so kann es viele Someclass-Objekte übergeben werden, aber wenn der Konstruktor aufrufen, müssen Sie immer das gleiche passieren, dass Sie als erstes Argument zu Foopass, ist das, was ich möchte haben:

foo(["A", "B", "X", "Y", "Z"], SomeClass("m", arg1), SomeClass("n", arg1)) 

so ist der Code kürzer und besser lesbar ist. Was sollte ich anstelle von arg1 setzen, um das erste Argument, das an foo übergeben wurde, zu "referenzieren"?

+1

Sie könnten den Prototyp von 'foo' ändern, so dass es wie' foo (["A", "B", "X", "Y", "Z"] verwendet werden könnte) m "," n ")' und intern 'foo' würden die verschiedenen Objekte instanziieren. Eine andere Lösung wäre, die Variable 'arg1' zu erstellen und sie nach dem Funktionsaufruf zu löschen. – Spirine

+0

Sprine, sollten Sie das als Antwort hinzufügen. Ihre erste Lösung ist besser als die bisher beantworteten. –

Antwort

2

Nein, es gibt keine solchen Referenzen; Sie haben ein Listen-Literal-Objekt übergeben. Es gibt keine anderen Referenzen als den internen Interpreter-Stack.

Erstellen Sie einfach Ihre eigene Referenz; speichern, dass die erste Liste in einer Variablen ersten, dann verweisen, dass:

arg1 = ["A", "B", "X", "Y", "Z"] 
foo(arg1, SomeClass("m", arg1), SomeClass("n", arg1)) 

Wenn foo() ist immer eine Reihe von SomeClass() Instanzen auf arg1, können Sie auch machen foo() verantwortlich für die Erstellung dieser Instanzen basieren müssen gehen . Der Pass in nur dieses ein anderen Argumente SomeClass():

foo(["A", "B", "X", "Y", "Z"], "m", "n") 

und in foo:

def foo(arg1, *arg2_values): 
    instances = [SomeClass(arg1, arg2) for arg2 in arg2_values] 

nun der Anrufer nur einmal in dieser Liste übergeben hat.

4

Warum nicht Variable verwenden:

arg1 = ["A", "B", "X", "Y", "Z"] 
foo(arg1, SomeClass("m", arg1), SomeClass("n", arg1)) 

HINWEIS: Listen als Referenz übergeben so, wenn Sie es innerhalb foo ändern oder SomeClass beim Initialisieren Sie könnten unvorhersehbare Ergebnis bekommen solchen Fall, dass Sie Kopie passieren müssen zu vermeiden Liste, sehen Sie mehr auf diesem How to clone or copy a list? Frage.

from copy import copy, deepcopy 


foo(copy(arg1), SomeClass("m", copy(arg1)), SomeClass("n", copy(arg1))) 

foo(arg1[:], SomeClass("m", arg1[:]), SomeClass("n", arg1[:])) 
foo(deepcopy(arg1), SomeClass("m", deepcopy(arg1)), SomeClass("n", deepcopy(arg1))) 

wichtiger Moment ist, dass die Liste Slicing ([:]):

Um Referenz Problem zu beheben Sie Kopie Liste vor Verabschiedung, um es zu SomeClass oder foo, kann es mit copy.copy(), copy.deepcopy() oder list slicing erfolgen und copy.copy() zurück flache Kopie der Liste unterdessen copy.deepcopy() zurückgibt tiefe Kopie. Sehen Sie mehr unter What exactly is the difference between shallow copy, deepcopy and normal assignment operation?

Verwandte Themen