擅长:python、mysql、java
<p>完全按照您的方式—在修改值之前复制值。Python没有C++之类的稳定性概念(无论如何都不是太大),所以没有办法强制你只在参数上使用非突变操作。p>
<p>而且,也没有办法将参数声明为作为副本传递,而不是作为引用传递</p>
<p>如果您知道自己的领域(如矩阵),您可以尝试&;通过在装饰器中复制参数,使这种方法更具声明性</p>
<pre><code> 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
</code></pre>