私が取り組んでいるプロジェクトでは、リンクされたリストのデータ構造を実装しています。これは、次のように定義するペアのアイデアに基づいています。
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
ここでself.next_pair
、 とself.prev_pair
は、それぞれ前のリンクと次のリンクへのポインターです。
リンクリストをセットアップするために、次のようなインストール機能があります。
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
プログラムの過程で、私はこれらのリンクされたリストの辞書を作成し、いくつかのリンクを削除して別のリストに追加しています。プルーニングと再インストールの間、リンクは中間配列に格納されます。
このプログラムをデバッグしているうちに、Python が引数を関数に渡す方法についての私の理解に欠陥があることに気付きました。私が書いたこのテストケースを考えてみましょう:
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
このテストを実行すると、次の結果が得られます。
0
0
10
None
10108
0
私が理解していないのは、 の 2 番目の呼び出しが最初の呼び出し ( ) とp.next_pair
は異なる結果 ( ) を生成する理由です。渡されたものを上書きできるオブジェクトを返しません( を返します) 。ポインターを渡しているようではありません。10108
0
install
Pair
None
install
値渡しについての私の理解では、インタープリターは関数に渡された値をコピーし、呼び出し元の変数は変更されないままです。たとえば、私が言うなら
def foo(x):
x = x+1
return x
baz = 2
y = foo(baz)
print y
print baz
次に3
、 と2
をそれぞれ印刷する必要があります。実際、Python インタープリターでそれをテストすると、それが起こります。
ここで誰かが私を正しい方向に向けることができれば、本当に感謝しています。