Python 原地修改变量

8 投票
2 回答
10503 浏览
提问于 2025-04-18 00:04

我最近在学习如何在Python中使用random.shuffle这个函数,发现它可以直接在原来的地方打乱一个变量,而不需要返回任何东西,这让我很惊讶。这个函数是怎么做到的呢?我查看了随机库的源代码,但没有找到答案。

我该如何写一个自己的函数,让它也能在原地改变变量,而不需要重新赋值呢?

2 个回答

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]
6

这个问题的关键在于列表是可以改变的。你不能重新给任何变量赋值,因为那样会变成一个新的变量。对于不可改变的类型的变量,你不能修改它。而可改变的变量是可以修改的。

所以:

>>> 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]

撰写回答