【问题标题】:python object changes the value of an input variablepython 对象改变输入变量的值
【发布时间】:2016-05-27 06:11:00
【问题描述】:

所以我不知道这是否是一个格式正确的问题,如果不是,我很抱歉,但我很困惑。此外,我不知道如何提交一个最小的工作示例,因为没有整个代码我无法重现该行为,这对于 stackexchange 来说有点大。

所以问题来了:我有一个对象,它的参数之一是一个 numpy 数组。 (如果有帮助,这个数组代表了一个微分方程的初始条件,我的对象中的一个方法在数值上求解。)在使用这个数组求解微分方程后,它输出的答案很好,但是我原来的变量存储的数组现在已经改变了值。这是我发生的事情:

import numpy as np
import mycode as mc

input_arr = np.ndarray(some_shape)
foo = mc.MyClass(input_arr)
foo.numerical_solve()
some_output

很好,花花公子。但是,当我查看input_arr 时,它的值发生了变化。有时和some_output一样(也就是数值解的最终值),但有时是一些插页式的步骤。

正如我所说,我完全被难住了,任何建议都将不胜感激!

【问题讨论】:

  • 你需要显示你的班级代码和numerical_solve。大概numerical_solve 正在改变数组(例如,通过在其中设置值)。
  • MyClassnumeric_solve 没有理由不能更改 input_arr,这很常见。例如,有时这将用于节省时间和/或空间;例如,numpy 的中缀运算符(例如,x += 1)可以比重复复制数组更快。如果您想保存原件,您可以制作一份副本,但先验更改并不表示有问题。
  • 为什么不用副本?
  • foo = mc.MyClass(np.copy(input_arr)) 复制数组。
  • numpy.copy() 肯定能解决问题

标签: python arrays object numpy numerical-integration


【解决方案1】:

如果您有一个可变对象(listsetnumpy.array、...)并且您不希望它发生变异,那么您需要制作一个副本并传递它:

l1 = [1, 2, 3]
l2 = l1[:]

s1 = set([1, 2, 3])
s2 = s1.copy()

arr1 = np.ndarray(some_shape)
arr2 = np.copy(arr1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-19
    • 2021-04-10
    • 2017-05-24
    相关资源
    最近更新 更多