对于我正在进行的一个项目,我正在实现一个链表数据结构,它基于一对的想法,我将其定义为:
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
我不明白为什么第二次调用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 解释器中测试它时,就会发生这种情况。
如果有人能在这里指出正确的方向,我将不胜感激。