当前位置: 首页 > 面试题库 >

在python中模拟按值传递行为

柴砚文
2023-03-14
问题内容

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

一种可能的方法是使用深层复制:

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

有没有更有效或更 Python的 方法来实现此目标,对传递的对象进行尽可能少的假设(例如.clone()方法

编辑

我知道技术上python中的所有内容都是按值传递的。我对 模拟
行为很感兴趣,即确保我不会弄乱传递给函数的数据。我猜最一般的方法是使用其自身的克隆机制或Deepcopy来克隆所讨论的对象。


问题答案:

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

Python提供很少的设施来 强制执行
诸如私有或只读数据之类的事情。python的哲学是“我们都是成年人”:在这种情况下,这意味着“该功能不应更改数据”是规范的一部分,但未在代码中强制执行。

如果要复制数据,则可以找到最接近的解决方案。但是copy.deepcopy,除了是低效的,也有注意事项,例如:

因为深层副本会复制所有内容,所以它可能会复制过多,例如,即使在副本之间也应共享的管理数据结构。

[…]

该模块不复制诸如模块,方法,堆栈跟踪,堆栈框架,文件,套接字,窗口,数组或任何类似类型的类型。

因此,仅当您知道您正在处理内置的Python类型或您自己的对象时(如果您可以通过定义__copy__/__deepcopy__特殊方法自定义复制行为,而无需定义自己的clone()方法),我才建议这样做。



 类似资料:
  • 问题内容: 我是一个完整的Java新手。我知道Java将所有参数都视为按值传递,并且还有其他几个线程可以解释这一点。 例如,在C ++中,我可以执行以下操作: 哪个将输出3。我知道在Java中,所有参数都是按值传递的,因此您无法操纵传入的参数。在Java中,有没有一种标准的方法来 模拟 按引用传递?有没有办法调用操作传入变量的函数?对于我来说,很难绕开没有办法做到这一点的想法。 问题答案: 模拟传

  • 问题内容: 当您将诸如list,array之类的集合传递给python中的另一个函数时,它是否会复制它,还是只是一个指针? 问题答案: Python按值传递对对象的引用。 Python按值传递对对象的引用(例如Java),Python中的所有对象都是对象。这听起来很简单,但是随后您会注意到某些数据类型似乎表现出按值传递特性,而其他数据类型似乎表现为按引用传递……这是怎么回事? 了解可变和不可变的对

  • 问题内容: 我读了许多文章,都说Java是通过价值传递的。但是我仍然不能解释按值传递和引用之间的区别。我写了一个示例程序,它像这样执行。 执行 谁能向我解释这些问题… 价值传递是什么意思? 答:它只是将存储在变量中的数字或值传递给函数。我是对还是错。 How do you say Java是通过价值传递? 为什么Java是按值传递而不是按引用传递? 上面的程序Tries是否显示了“按值传递”和“引

  • 问题内容: 如果我将数据帧传递给函数并在函数内部对其进行修改,那么它是按值传递还是按引用传递? 我运行以下代码 函数调用后,的值不变。这是否意味着价值传递? 我也尝试了以下 事实证明,变化并没有。为什么会这样呢? 问题答案: 简短的答案是,Python始终会传递值,但每个Python变量实际上都是指向某个对象的指针,因此有时看起来像是传递引用。 在Python中,每个对象都是可变的或不可更改的。例

  • 我有一个scala类a,其中有一个方法。 还有一个B类

  • 因此,在父对象的状态中所做的更改也可以通过它所出现的道具立即在子对象中使用。 这样做正确吗?