Python 避免可变性bug的常规(有效)方法是什么?

Python 避免可变性bug的常规(有效)方法是什么?,python,python-3.x,Python,Python 3.x,如果您将可变类型传递到函数或方法中,然后在该函数或方法内部无意中对其进行了变异,那么它在外部范围中也会发生更改,这可能会导致非常糟糕且难以找到的bug 在传递可变类型时,业界认可的解决方法是什么 例如,您可以使用以下列表: def func(myList): myList = myList[:] 此后,在函数myList中会有一个可以安全变异的副本。与使用复制模块相同。但这是最好的还是标准的方法呢 或者每个人都只是在做其他事情之前将所有参数重新分配给局部范围变量?这是一个恼人的额外步骤

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

在传递可变类型时,业界认可的解决方法是什么

例如,您可以使用以下列表:

def func(myList):
    myList = myList[:]
此后,在函数
myList
中会有一个可以安全变异的副本。与使用
复制
模块相同。但这是最好的还是标准的方法呢

或者每个人都只是在做其他事情之前将所有参数重新分配给局部范围变量?这是一个恼人的额外步骤,更改参数的名称…

我通常使用
list()
,因为这需要任何iterable

def func(iterable):
    myList = list(iterable)
现在,您可以使用
func(zip(x,y))
调用func,而不必担心
zip
在Python3中不返回列表。

我通常使用
list()
,因为它需要任何iterable

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

现在,您可以使用
func(zip(x,y))
调用func,而不必担心
zip
在Python3中不返回列表。

如果需要副本,请复制副本,否则什么都不做。你不需要本能地复制每一个论点。当你编写一个函数的时候,想想什么样的东西会被传递进来,想想你是否需要改变这些东西。如果您这样做了,并且您不想在外部修改它们,那么请复制它们。传入您确实希望变异的可变对象并非闻所未闻


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

如果需要拷贝,就复制一个副本,否则不要做任何事情。你不需要本能地复制每一个论点。当你编写一个函数的时候,想想什么样的东西会被传递进来,想想你是否需要改变这些东西。如果您这样做了,并且您不想在外部修改它们,那么请复制它们。传入您确实希望变异的可变对象并非闻所未闻


换句话说,不要在每个函数的开头寻找一些通用的样板文件。只需考虑每个函数需要做的事情。

在我的脑海中,这个解决方案只适用于一些场景(参数是可迭代的),并且不是非常直观的:“AyviviStA:它如何比<代码> AG[[:]:<代码> >?> AyviviStAd:Cald>列表(x)将与<代码> x:[/] < /COD>相同,当<代码> x <代码>是一个列表时,因此,如果
[:]
是,它总是适用的。对于一个列表,这是真的,但我试图找出是否有任何实践是普遍适用的。
list()
是普遍适用的。只要
[:]
和更多的情况下,它都会工作。在我看来,这个解决方案只适用于某些场景(参数是可设置的),而且不是很直观---@Aerovistae:它怎么会比
arg[:]
更不直观?@Aerovistae
列表(x)
将与
x[:]做的一样
x
是一个列表时,所以如果
[:]
是,它总是适用的。对于一个列表,是真的,但我试图找出是否有任何实践是普遍适用的。
list()
是普遍适用的。只要
[:]
以及更多的情况下,它都会起作用。对象字段的访问控制(如果有)和方法文档。对象字段的访问控制(如果有)和方法文档。