python的“内存中”变量如何工作

沃伊切赫

我试图了解“内存中”如何在 python 中工作。据我了解,它是一个不存储在任何地方的变量,只是在内存中浮动。我不完全确定如何正确措辞。

为了澄清我正在使用 PyKEP 模块,并且我正在加载 SPICE 内核pykep.util.load_spice_kernel('kernel_name.bsp')链接到文档

当我这样做时,我在全局范围内没有新变量。但是,它允许我随后访问我将调用的小行星的更多数据(速度、位置等)。

asteroid = pk.planet.spice(spiceID, 'SUN', 'ECLIPJ2000', 'NONE', pk.MU_SUN, mu_self, self_radius, self_radius * 1.05)

我现在可以asteroid.eph(epoch)在全局范围内使用而不会出现任何错误。但是,如果我在其他地方定义它或尝试移动它,情况并非如此。

例如:

示例 1:函数

注意 pk 是下面的 PyKEP 模块。

def loadKernel(name = 'de440s_Ryugu.bsp', spiceID = '162173', mu_self = 30.03336, self_radius = 432.5):
    pk.util.load_spice_kernel(name)
    asteroid = pk.planet.spice(spiceID, 'SUN', 'ECLIPJ2000', 'NONE', pk.MU_SUN, mu_self, self_radius, self_radius * 1.05)
    return asteroid

在函数的本地范围内我可以使用asteroid.eph(epoch),但在外面我需要重新执行第一行。这是有道理的。但是,为什么我不能将它返回到全局范围。

示例 2:内部对象/类

class Trajectory:
    def __init__(
            self,
            seq=[pk.planet.gtoc7(3413), pk.planet.gtoc7(
                234), pk.planet.gtoc7(11432)])
        # We define data members:
        self.__seq = seq

    def velAndPos(self):
        r, v = self.__seq[i + 1].eph(end)
        return r, v

在这里我会遇到一个错误,说即使我pykep.util.load_spice_kernel('kernel_name.bsp')在 velAndPos 方法的第一行添加内核文件也没有加载。为什么会这样?是因为__seq是女贞吗?

此外,使用“内存中”变量有什么好处?

先感谢您。

帕迪奥尔顿

我快速浏览了一下,pykep我怀疑其中一些混淆是因为它是用 C++ 实现并绑定到 Python 的。

内核似乎是加载函数带入内存的二进制数据文件,然后其他pykep函数可以访问它们(同样,在引擎盖下它都是 C++)。

因此,您没有看到数据显示为 Python 变量也就不足为奇了。

现在,至于您的代码 - 使用类管理数据是一种很好的做法。您实际上可以在类定义范围内运行任意代码,所以我认为以下内容有很大的工作机会:

class Trajectory:

    pk.util.load_spice_kernel(name)

    def __init__(self, seq=None, name=None):

        if seq is None:
            # don't use something mutable as your default value,
            # else modifying it also modify the default behaviour
            seq = [
                pk.planet.gtoc7(3413),
                pk.planet.gtoc7(234),
                pk.planet.gtoc7(11432)
            ]
        # We define data members:
        self.__seq = seq

    def velAndPos(self):
        r, v = self.__seq[i + 1].eph(end)
        return r, v

如果这不起作用,您可以尝试在这两种方法中调用 load ,但这似乎效率低下。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章