2016-09-17 32 views
0

代码被传递给一个数组。我的理解是这个传球是通过参考完成的。我希望该函数递归地将列表中的最后一半剩余部分分为两部分,并将其分割为零的每个值进行设置。 对数组的改变发生在数组中,但当我在最后调用print a时,我得到原始数组。如何通过引用传递函数来更改列表?

我在做什么错了?

a = range(10) 

def listreduction(array): 
    if len(array) == 1: 
     array[0] = 0 
     return 

    split = len(array)/2 
    array[split] = 0 

    return listreduction(array[split:]) 

listreduction(a) 
print a 

的电流输出为

[0, 1, 2, 3, 4, 0, 6, 7, 8, 9] 

的应该是更多的零到第二个

+1

您期望得到的输出是什么? – BPL

+0

范围!=数组顺便说一句。由于范围是不可变的,它必须被复制为函数内某个数组的数组,因此是问题。总是明确地返回;不要依赖副作用。我实际上不记得Python是否通过引用。我似乎记得它比这更复杂。 – Carcigenicate

+0

当您使用递归时,您不会将实际列表传递给该方法。那就是问题所在。 – scriptmonster

回答

1

这可能是你想要的。

a = range(1, 10) 

def list_reduction(l, prev_split_pos=None): 
    split_pos = (len(l) + prev_split_pos)/2 if prev_split_pos else len(l)/2 
    if split_pos == prev_split_pos: 
     return 
    l[split_pos] = 0 
    return list_reduction(l, split_pos) 

list_reduction(a) 
print a 

所以,你的代码。每次你做一个列表片时,你实际上会生成一个新列表,而这个列表根本不会与旧列表相关联。这就是为什么除第一个之外没有看到任何突变。

+0

谢谢!这正是我所期待的。我开始怀疑我的列表传递是创建副本,而不是只在子列表上运行,但仍然存在。 – MattTheSnake

+0

@MattTheSnake不客气。作为一个侧面说明,看看这个关于在Python中传递参考/值的好问题,以便更好地掌握它:http://stackoverflow.com/questions/986006/how-do-i-pass-a-variable-通过参考 –

+0

这绝对有助于清除事情。再次感谢您的帮助 – MattTheSnake

1

由于您使用递归,在参数切片操作将创建新的列表实例的右侧这与你的实例不同。这就是原因。

你可以改变你的代码如下:

a = range(10) 

def list_reduction(array, position=0): 
    if len(array) -1 <= position: 
     return 

    split = position + (len(array) - position)/2 
    array[split] = 0 
    return list_reduction(array, split) 

list_reduction(a) 
print a 

输出是:

[0, 1, 2, 3, 4, 0, 6, 0, 0, 0] 
+0

这实际上不起作用。事实上,他实际上并没有返回这份名单。 – Carcigenicate

+0

我的不好,编辑并纠正了我的错误。 – scriptmonster

+0

你输出的长度是11,怎么可能? –

2

切片创建一个新的列表。如果您想递归执行此操作,您必须传递函数应该在列表中工作的索引,而不是实际的切片。

1

Python中的argumnet传递不同于其他传统的编程语言。参数通过对象引用传递。而被引用的对象是否会被修改取决于两件事

  • 该变量是否可变或不可变。在你的情况下,range将创建一个列表,因此它是一个可变对象。这意味着如果你更新array它也应该更新a
  • 操作。 =操作将始终创建新的对象引用。所以即使在你的情况下,array也是可变的,但是由于你正在做赋值操作,它会创建一个新的对象引用。

下面的例子应该为你清理的东西。

实施例1

>>> a = [1,2] 
    def fun1(array): 
     array= array + [3] 
     print "var array = %s" %array 

    fun1(a) 
    print "var a = %s" %a 

输出

var array = [1, 2, 3] 
var a = [1, 2] 

实施例2

a = [1,2] 
def fun1(array): 
    array.append(3) 
    print "var array = %s" %array 

fun1(a) 
print "var a = %s" %a 

输出

var array = [1, 2, 3] 
var a = [1, 2,3] 
相关问题