将*args直接赋值给实例属性是否安全?是否需要使用深拷贝?
问题解答
这种写法的安全性取决于你传入*args的参数类型,以及你对类内部属性和外部原对象的使用预期:
- 如果传入
args的所有元素都是不可变对象(比如int、str、tuple、frozenset等),那么当前写法完全安全,不需要做深拷贝。不可变对象本身无法被修改,就算外部持有原对象的引用,也不会影响类内部的_metrics属性取值。 - 如果传入的元素包含可变对象(比如list、dict、自定义可变类的实例等),那么当前写法存在潜在风险:
args本身是元组类型,内部存储的是传入参数的引用,直接赋值给self._metrics会导致类内部和外部共享这些可变对象的引用。后续无论是外部修改原可变对象,还是类内部修改self._metrics的元素,两边的取值都会同步变化,极易引发不符合预期的bug。
是否需要做深拷贝
你可以根据自己的使用场景选择:
- 如果你希望类内部的
_metrics和外部传入的参数完全解耦,既不受外部修改的影响,也不希望内部修改传递到外部,就需要做深拷贝,参考写法如下:
import copy class BirdViewMetric(object): def __init__(self, metric_type, *args): self._metric_type = metric_type self._metrics = copy.deepcopy(args)
- 如果你确认所有传入的参数都是不可变类型,或者你明确需要共享引用的效果,就不需要做额外的拷贝,还能避免深拷贝带来的性能开销。
内容的提问来源于stack exchange,提问作者codeforester
相关产品推荐
相关产品推荐

