Rückgabe eines lvalue aus einer Funktion in Python

8

[Entschuldigung, ich bin neu in Python. Obwohl es eine sehr grundlegende Frage zu sein scheint, habe ich meinen Anteil an Due Diligence geleistet, bevor ich diese Zuhörerschaft gebeten habe, wirklich dumme Fragen zu vermeiden.]

Ich versuche das richtige Idiom für die Rückgabe eines l-Wertes aus einer Funktion herauszufinden. Angenommen, ich habe einen Container mit 64 Objekten und möchte einen Verweis auf diese Objekte zurückgeben können.

%Vor%

Dann von außerhalb der Klasse möchte ich:

%Vor%

Ich möchte also, dass die Funktion 'at' einen lvalue zurückgibt (so etwas wie eine Referenz in C ++), aber ich kann nichts finden, was einer Referenz oder einem Zeiger in der Sprache ähnelt. Wenn ich eine Liste in jedem Quadrat, das ein Stück enthält, gespeichert habe, könnte ich etwas wie board.square (0,0) [0] = Piece machen - aber es scheint verrückt (oder auch nicht - Wie gesagt, ich bin neu in der Sprache).

Wie würden Sie diese Datenstruktur angehen?

    
Uri 01.04.2012, 14:25
quelle

4 Antworten

8

In Python ist alles eine Referenz. Das einzige Problem ist, dass None unveränderlich ist. Daher können Sie den Rückgabewert nicht verwenden, um den Wert zu ändern.

Sie können den Zuweisungsoperator auch nicht überschreiben, so dass Sie diese besondere Art von Verhalten nicht erhalten. Eine gute und sehr flexible Lösung wäre jedoch, die __setitem__ und __getitem__ Methoden zur Implementierung des Subskriptionsoperators ( [] ) für die Klasse:

%Vor%

Verwendung:

%Vor%     
Niklas B. 01.04.2012, 14:29
quelle
1

Wie Niklas betont, können Sie keinen l-Wert zurückgeben.

Sie können jedoch nicht nur das Abonnement überschreiben, sondern auch Eigenschaften (eine Anwendung von Deskriptoren: Ссылка ), um ein Objektattribut zu erstellen, das beim Lesen oder bei der Zuordnung Code ausführt.

    
Marcin 01.04.2012 14:54
quelle
1

(Beantworte deine Frage nicht im Titel, sondern deine Frage "Wie würdest du mit dieser Datenstruktur umgehen?") Eine pythischere Lösung für deine Datenstruktur wäre eine Liste von Listen:

%Vor%     
Udi 01.05.2012 08:14
quelle
1

Sie können so etwas versuchen, allerdings auf Kosten von falschen [:] Indexern:

%Vor%

Dann können Sie

tun %Vor%

Und so weiter. Es spielt eigentlich keine Rolle, was du in die [] s steckst, es muss einfach etwas sein.

(Hat die Idee von den Proxies Perl6 verwendet, um dies zu tun)

    
clsn 28.01.2014 21:13
quelle

Tags und Links