0

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

这是代码:

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 没有改变它的顺序。该函数需要返回无,所以我可以使用 t=shuffle(t,n)。无论如何我可以做到这一点?

4

2 回答 2

2

你的问题就在这里:

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

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

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

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

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

于 2013-11-02T23:13:52.693 回答
2

xs是函数的局部引用,并且独立于t. 当您重新分配时xst仍然指向原始列表。

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

orig_xs = xs
# do stuff here
orig_xs[:] = xs
于 2013-11-02T23:00:23.007 回答