如何编写类方法,使其参数不被更改?

2024-09-27 21:34:18 发布

您现在位置:Python中文网/ 问答频道 /正文

在python类中,我有一些方法:

def method0(self,x,y,z):
 s=x
 s=method1(self,s,y)
 s=method2(self,s,z)
 return s

当我运行上述代码(我不希望x被更改)时,x会随着s而更改(为什么?
但当我使用复制模块x时,它不会改变:

def method0(self,x,y,z):
 s=copy.copy(x)
 s=method1(self,s,y)
 s=method2(self,s,z)
 return s

如何编写方法0,使x不被更改


Tags: 模块方法代码selfreturndefcopymethod1
2条回答

完全按照您的方式—在修改值之前复制值。Python没有C++之类的稳定性概念(无论如何都不是太大),所以没有办法强制你只在参数上使用非突变操作。p>

而且,也没有办法将参数声明为作为副本传递,而不是作为引用传递

如果您知道自己的领域(如矩阵),您可以尝试&;通过在装饰器中复制参数,使这种方法更具声明性

 from copy import deepcopy
 from functools import wraps

 def deepcopied(f):
     @wraps(f)
     def _d(*args, **kwargs):
         real_args = []
         real_kwargs = {}
         for arg in args:
             if isinstance(arg, (list, dict)):
                 arg = deepcopy(arg)
             real_args.append(arg)
         for key, value in kwargs.iteritems():
             if isinstance(value, (list, dict)):
                 value = deepcopy(value)
             real_kwargs[key] = value
         return f(*real_args, **real_kwargs)
     return _d


 @deepcopied
 def foo(a, b=None):
     a.append("mutated!")
     if b is not None:
         b["bar"].append("mutated")


 one = list()
 two = dict(bar=list())

 foo(one, two)
 print one, two

防止x被更改的另一种方法是确保任何函数都不会更改其参数。您的问题源于method1或method2正在更改其参数这一事实。但是您也从这些方法返回值。修复这些方法,使其不改变传递给它们的矩阵,而只生成新的矩阵,那么问题就解决了

相关问题 更多 >

    热门问题