Für ein Projekt arbeite ich an, ich bin eine verknüpfte Liste Datenstruktur Implementierung, die auf der Idee eines Paares basiert, die ich als definieren:Wie funktioniert Calling in Python?
class Pair:
def __init__(self, name, prefs, score):
self.name = name
self.score = score
self.preferences = prefs
self.next_pair = 0
self.prev_pair = 0
wo self.next_pair
und self.prev_pair
sind Zeiger auf den vorherigen bzw. nächsten Link.
Um die verknüpfte Liste einzurichten, habe ich eine Installationsfunktion, die so aussieht.
def install(i, pair):
flag = 0
try:
old_pair = pair_array[i]
while old_pair.next_pair != 0:
if old_pair == pair:
#if pair in remainders: remainders.remove(pair)
return 0
if old_pair.score < pair.score:
flag = 1
if old_pair.prev_pair == 0: # we are at the beginning
old_pair.prev_pair = pair
pair.next_pair = old_pair
pair_array[i] = pair
break
else: # we are not at the beginning
pair.prev_pair = old_pair.prev_pair
pair.next_pair = old_pair
old_pair.prev_pair = pair
pair.prev_pair.next_pair = pair
break
else:
old_pair = old_pair.next_pair
if flag==0:
if old_pair == pair:
#if pair in remainders: remainders.remove(pair)
return 0
if old_pair.score < pair.score:
if old_pair.prev_pair==0:
old_pair.prev_pair = pair
pair.next_pair = old_pair
pair_array[i] = pair
else:
pair.prev_pair = old_pair.prev_pair
pair.next_pair = old_pair
old_pair.prev_pair = pair
pair.prev_pair.next_pair = pair
else:
old_pair.next_pair = pair
pair.prev_pair = old_pair
except KeyError:
pair_array[i] = pair
pair.prev_pair = 0
pair.next_pair = 0
Im Laufe des Programms, Ich baue ein Wörterbuch dieser verknüpften Listen nach oben und Links Einnahme von einigen aus und das Hinzufügen von ihnen in anderen. Zwischen dem Löschen und der Neuinstallation werden die Verknüpfungen in einem Zwischenfeld gespeichert.
Während des Debuggens dieses Programms habe ich erkannt, dass mein Verständnis der Art und Weise, wie Python Argumente an Funktionen übergibt, fehlerhaft ist. Stellen Sie sich diesen Testfall, den ich schrieb:
def test_install():
p = Pair(20000, [3, 1, 2, 50], 45)
print p.next_pair
print p.prev_pair
parse_and_get(g)
first_run()
rat = len(juggler_array)/len(circuit_array)
pref_size = get_pref_size()
print pref_size
print install(3, p)
print p.next_pair.name
print p.prev_pair
Wenn ich diesen Test ausführen, bekomme ich das folgende Ergebnis.
0
0
10
None
10108
0
Was ich nicht verstehe ist, warum der zweite Aufruf von p.next_pair
ein anderes Ergebnis erzeugt (10108
) als der erste Anruf (0
). install
gibt kein Pair
Objekt zurück, das den übergebenen überschreiben kann (es gibt None
zurück), und es ist nicht so, als ob ich einen Zeiger an install
übergebe.
Mein Verständnis von call-by-value ist, dass der Interpreter die Werte kopiert in eine Funktion übergeben, die Variablen des Aufrufers unverändert lassen. wenn ich sage, zum Beispiel
def foo(x):
x = x+1
return x
baz = 2
y = foo(baz)
print y
print baz
Dann 3
und 2
sollten bzw. ausgedruckt werden. Wenn ich das im Python-Interpreter teste, passiert das tatsächlich.
Ich würde es wirklich schätzen, wenn mir hier jemand in die richtige Richtung zeigen könnte.
Python hat keinen Call-by-Value. Es hat auch keinen Anruf-durch-Verweis. –
FYI, Sie können die Schaltfläche '{}' oben im Bearbeitungsfeld verwenden, um einen ausgewählten Codeblock um 4 Leerzeichen einzurücken - dies ist ein einfacher Weg, den korrekten Einzug beizubehalten. – senderle
Die 'Pair' Klasse sieht aus wie sie sollte wahrscheinlich ein' dict' sein. – Daenyth