我正在尝试更改我在函数中作为参数放置的列表的值。
这是代码:
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)。无论如何我能做到这一点?
答案 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
仍然是传入的相同列表,因此对函数外部列表的所有引用也将看到更改。