python - 在 python 中模拟传值行为

标签 python pass-by-value

我想模拟 python 中的按值传递行为。换句话说,我想绝对确保我编写的函数不会修改用户提供的数据。

一种可能的方法是使用深拷贝:

from copy import deepcopy
def f(data):
    data = deepcopy(data)
    #do stuff

有没有更有效或更pythonic的方法来实现这个目标,对传递的对象做尽可能少的假设(例如.clone()方法)

编辑

我知道从技术上讲,python 中的所有内容都是按值传递的。我对模拟行为很感兴趣,即确保我不会弄乱传递给函数的数据。我想最通用的方法是使用自己的克隆机制或使用 deepcopy 克隆有问题的对象。

最佳答案

没有pythonic的方法可以做到这一点。

Python 为强制诸如私有(private)或只读数据之类的事物提供了很少的工具。 pythonic 的哲学是“我们都是同意的成年人”:在这种情况下,这意味着“函数不应更改数据”是规范的一部分,但未在代码中强制执行。


如果您想制作数据的副本,您可以获得的最接近的解决方案就是您的解决方案。但是copy.deepcopy,除了效率低下,还有一些注意事项such as :

Because deep copy copies everything it may copy too much, e.g., administrative data structures that should be shared even between copies.

[...]

This module does not copy types like module, method, stack trace, stack frame, file, socket, window, array, or any similar types.

所以我只推荐它,如果你知道你正在处理内置的 Python 类型或你自己的对象(你可以通过定义 __copy__/ 来自定义复制行为__deepcopy__ 特殊方法,不需要自己定义clone()方法)。

关于python - 在 python 中模拟传值行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/845110/

相关文章:

c++ - 为什么 std::promise::set_value() 有两个重载

Java函数参数值正在改变

java - 这是如何适应java中的 "pass by value of refrences"的?

java - 在比较 Java 中的整数包装器时,为什么 128==128 为假,而 127==127 为真?

javascript - 是否可以在 Python 中将函数打印为字符串?

python - 如何避免在 Django 1.6 的功能测试中多次创建管理员?

python - 非阻塞文件结束

python - 如何在训练模型上获得新的未见文档的界限或困惑值?

python - Google Cloud Run 不加载 .env 文件

python - 将变量和列表传递给 Python 中的函数