我最近在学习如何在Python中使用random.shuffle
,我很惊讶地看到该函数将变量移动到位而不返回任何内容。这是如何在功能中实现的?查看随机库的源代码没有得到答案。
如何编写我自己的函数,在没有重新分配的情况下更改变量?
答案 0 :(得分:4)
我是作品,因为列表是可变的。您无法重新分配任何变量,因为它将是新变量。你不能修改不可变的类型变量。您可以修改可变变量。
所以:
>>> def addone(x):
... x += 1
>>> a = 2
>>> addone(a)
>>> a
2
>>> def addone(x):
... x.append(1)
...
>>> l=[2]
>>> addone(l)
>>> l
[2, 1]
>>> def addone(x):
... x = x + [1]
...
>>> li=[2]
>>> addone(li)
>>> li
[2]
答案 1 :(得分:1)
好吧,看看random.shuffle
的实施情况。在名为random.py
的文件中找到它,它是一个纯python实现并且非常简单 - 只需使用循环赋值(使用元组解包)。
def shuffle(self, x, random=None, int=int):
"""x, random=random.random -> shuffle list x in place; return None.
Optional arg random is a 0-argument function returning a random
float in [0.0, 1.0); by default, the standard random.random.
Do not supply the 'int' argument.
"""
if random is None:
random = self.random
for i in reversed(xrange(1, len(x))):
# pick an element in x[:i+1] with which to exchange x[i]
j = int(random() * (i+1))
x[i], x[j] = x[j], x[i]