Python,更改函数内参数的值

时间:2013-11-02 22:58:10

标签: python function arguments

我正在尝试更改我在函数中作为参数放置的列表的值。

这是代码:

def shuffle(xs,n=1):
if xs: #if list isn't empty
    if n>0:
        #gets the index of the middle of the list 
        sizel=len(xs)
        midindex=int((sizel-1)/2) 
        for times in range(n):
            xs=interleave(xs[0:midindex],xs[midindex:sizel])
return None

交错代码返回一个列表,其中两个列表的值混合在一起。

然而,当我跑:

t=[1,2,3,4,5,6,7]  
shuffle(t,n=2)
print t

列表t没有改变它的顺序。该函数需要返回None,所以我可以使用t = shuffle(t,n)。无论如何我能做到这一点?

2 个答案:

答案 0 :(得分:2)

xs是函数的本地引用,与t无关。当您重新分配xs时,t仍指向原始列表。

由于您不能从函数返回任何内容,因此解决方法是保留对原始列表的引用并使用切片赋值重新填充它:

orig_xs = xs
# do stuff here
orig_xs[:] = xs

答案 1 :(得分:2)

你的问题就在这里:

xs=interleave(xs[0:midindex],xs[midindex:sizel])

您正在制作列表切片以传递给interleave()函数。这些基本上是部分列表的副本。从函数返回的内容不能是xs的不同列表。

幸运的是,您可以重新分配返回原始列表的新列表。也就是说,保持xs指向同一个列表,但将中的所有项替换为您从interleave()函数返回的内容。

xs[:]=interleave(xs[0:midindex],xs[midindex:sizel])

这称为切片分配。由于xs仍然是传入的相同列表,因此对函数外部列表的所有引用也将看到更改。