对于我正在研究的一个项目,我正在执行一个链接清单数据结构,它基于一对概念,我将其定义为:
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
产生不同于第一个呼叫( 0
)的结果( 10108
)。 s>安装
没有返回一个能够覆盖所通过对象的 pair
对象(它返回 none
),它也不像我通过 安装
一个指针。
我对呼呼逐个价值的理解是 口译员会复制通过到一个函数的值, 留下调用者变量不变。 例如, 如果我说
def foo(x):
x = x+1
return x
baz = 2
y = foo(baz)
print y
print baz
然后应该分别打印 3
和 2
。 事实上,当我在 Python 解释器中测试时, 情况就是这样 。
我真的很感激 如果有人能指示我 正确的方向在这里。