2

如果您将可变类型传递给函数或方法,然后无意中在该函数或方法内对其进行了变异,它也会在外部范围内被更改,这可能会导致非常糟糕且难以发现的错误。

传递可变类型时,业界接受的解决方法是什么?

例如,您可以使用列表:

def func(myList):
    myList = myList[:]

此后,该函数内部myList将是一个可以安全变异的副本。与使用copy模块相同。但这是最好的或标准的方法吗?

还是每个人都只是在执行其他任何操作之前将所有参数重新分配给局部范围变量?有点烦人的额外步骤,更改参数的名称......

4

2 回答 2

4

如果您需要副本,请制作副本,否则不要做任何事情。您不需要反射性地复制每个参数。当你写一个函数的时候,想想什么样的东西会被传入,想想你是否需要改变那些东西。如果你这样做了,并且你不想在外部修改它们,那么制作副本。传入您确实想要变异的可变对象并非闻所未闻。

换句话说,不要在每个函数的开头寻找一些通用的样板。只需考虑每个功能需要做什么。

于 2013-09-21T03:00:41.240 回答
0

我通常使用list(),因为它需要任何可迭代的。

def func(iterable):
    myList = list(iterable)

现在您可以调用 funcfunc(zip(x, y))并且不必担心zip在 Python 3 中不返回列表。

于 2013-09-21T02:53:32.523 回答