- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我想模拟 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/
我有以下正则表达式 /[a-zA-Z0-9_-]/ 当字符串只包含从 a 到z 大小写、数字、_ 和 -。 我的代码有什么问题? 能否请您向我提供一个简短的解释和有关如何修复它的代码示例? //var
我是一名优秀的程序员,十分优秀!