【发布时间】:2012-05-28 12:08:29
【问题描述】:
对于我正在进行的一个项目,我正在实现一个链表数据结构,它基于对的概念,我将其定义为:
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)。 install 不返回可以覆盖传入的 Pair 对象(它返回 None),也不是我在传递 install 指针。
我对按值调用的理解是解释器将传递的值复制到函数中,而调用者的变量保持不变。例如,如果我说
def foo(x):
x = x+1
return x
baz = 2
y = foo(baz)
print y
print baz
然后应该分别打印3 和2。事实上,当我在 Python 解释器中测试它时,就会发生这种情况。
如果有人能在这里指出正确的方向,我将不胜感激。
【问题讨论】:
-
Python 没有按值调用。它也没有引用调用。
-
仅供参考,您可以使用编辑框顶部的
{}按钮将选定的代码块缩进 4 个空格 - 这是保持正确缩进的简单方法。 -
Pair类看起来应该是dict。 -
我确定这是一个班级作业,而链表的实现才是重点;如果这是针对除类分配之外的其他实用的东西,那么列表和其他集合的所有方式都有许多更实用的实现。
标签: python programming-languages