【发布时间】:2010-10-25 02:41:09
【问题描述】:
我想模拟 python 中的按值传递行为。换句话说,我想绝对确保我编写的函数不会修改用户提供的数据。
一种可能的方法是使用深拷贝:
from copy import deepcopy
def f(data):
data = deepcopy(data)
#do stuff
有没有更有效或更pythonic的方式来实现这个目标,对传递的对象做尽可能少的假设(比如.clone()方法)
编辑
我知道从技术上讲,python 中的所有内容都是按值传递的。我对模拟行为很感兴趣,即确保我不会弄乱传递给函数的数据。我想最通用的方法是使用自己的克隆机制或使用 deepcopy 克隆有问题的对象。
【问题讨论】:
-
你已经做对了。
-
只是一个术语说明:Python 已经使用按值传递。许多值恰好是引用,因此您按值传递引用。如果 Python 使用传递引用,那么 def f(x): x = 5 实际上会改变调用者为调用者传递的表达式的值,但它不会。
-
@L.Gonsalves “pass-by-value”或“pass-by-reference”都没有描述 Python 的语义。参见例如mail.python.org/pipermail/python-list/2007-July/621112.html
-
@dF:您链接到的页面是......“困惑”。 Python 使用按值传递。 Python 中的所有变量都是对值的引用,这也是事实,但这并不能改变参数传递是按值传递的事实。页面本身承认 Java 按值传递,Java 中的非原始类型存储为引用。如果我们从 Java 中删除原始类型,它会不再是按值传递吗?不。同样,Python 变量总是存储引用的事实与它的参数传递是按值传递的事实是正交的。
-
@Laurence,这是一个常见的误解。 Python实际上都是通过引用传递的。变量赋值是一种指针绑定,它实际上并没有改变变量指向的数据结构。似乎是例外的字符串和整数之类的东西并不是真正的例外。它们是不可变的,因此对它们产生不同字符串/整数的任何操作实际上都会创建新的,如果它们不存在的话。
标签: python pass-by-value