我试图了解“内存中”如何在 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)
在全局范围内使用而不会出现任何错误。但是,如果我在其他地方定义它或尝试移动它,情况并非如此。
注意 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)
,但在外面我需要重新执行第一行。这是有道理的。但是,为什么我不能将它返回到全局范围。
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] 删除。
我来说两句