如果你将可变类型传递到一个函数或方法中,然后在该函数或方法中无意中改变它,它也会在外部范围内被改变,这可能会导致非常糟糕和难以找到的错误。
在传递可变类型时,行业接受的解决方法是什么?
例如,对于列表,您可以使用:
def func(myList):
myList = myList[:]
此后,在该功能内部myList
将是一个可以安全变异的副本。与使用 copy
模块相同。但这是最好的还是标准的方法?
还是每个人都在执行其他操作之前将所有参数重新分配给局部范围变量?有点烦人的额外步骤,更改参数的名称...
如果需要副本,请制作副本,否则不要执行任何操作。 你不需要反射性地复制每个参数。 当你编写一个函数时,想想要传入什么样的东西,想想你是否需要改变这些东西。 如果您这样做,并且不想在外部修改它们,请制作副本。 传入您想要更改的可变对象并非闻所未闻。
换句话说,不要寻找一些通用的样板放在每个函数的开头。 只需考虑每个函数需要做什么。
我通常使用list()
,因为它需要任何可迭代对象。
def func(iterable):
myList = list(iterable)
现在你可以用func(zip(x, y))
调用 func,而不必担心zip
Python 3 中不返回列表。