[英]How do python's "in memory" variables work
我試圖了解“內存中”在 python 中是如何工作的。根據我的理解,它是一個沒有存儲在任何地方的變量,而只是 memory 中的一種浮點數。我不確定如何正確地表達這個。
為了澄清我正在使用 PyKEP 模塊並且我正在加載 SPICE kernel pykep.util.load_spice_kernel('kernel_name.bsp')
。 文檔鏈接
當我這樣做時,我在全局 scope 中沒有新變量。但是,它允許我訪問我將調用的小行星的更多數據(速度、position 等)。
asteroid = pk.planet.spice(spiceID, 'SUN', 'ECLIPJ2000', 'NONE', pk.MU_SUN, mu_self, self_radius, self_radius * 1.05)
我現在可以在全局 scope 中使用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
在函數的本地 scope 內部我可以使用asteroid.eph(epoch)
但在外部我需要重新執行第一行。 這是有道理的。 但是,為什么不能返回到全局scope。
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 方法的第一行,也沒有加載 kernel 文件。 為什么會這樣? 是因為__seq
是女貞嗎?
此外,使用“內存中”變量的優勢是什么?
先感謝您。
您可以在全局 scope 中創建一個變量作為“全局變量”,然后在 function 定義中使用它,然后在 function 中將其聲明為“全局”。這是一個可以幫助您的示例:
globvar = 0
def set_globvar_to_one():
global globvar # Needed to modify global copy of globvar
globvar = 1
def print_globvar():
print(globvar) # No need for global declaration to read value of globvar
set_globvar_to_one()
print_globvar() # Prints 1
這是一個包含該主題的線程的鏈接: 在 function 中使用全局變量
盡我所能回答你的問題,但如果其他人知道得更多,請在評論中糾正我。
memory 變量是如何工作的? 鏈接到這里你會看到python and other high-level languages use a symbol table to map a variable name to the address it represents
。 從 PyKep 文檔中,您會發現對該實用程序的調用將 kernel 加載到 memory 中。此時,正在執行 python 進程的進程的頁表知道 kernel 已加載到何處。
它如何應用於您的代碼(最佳猜測)如果沒有看到您的項目結構,很難准確地說出來,但我會試一試。 我的猜測是您沒有正確排序對需要加載的 kernel 的方法/屬性的調用。例如,如果您僅在調用 function 時加載 kernel,則 kernel 將不存在於進程中,直到 function 被調用叫。
我快速查看了pykep
,我懷疑有些混淆是因為它在 C++ 中實現並綁定到 Python。
內核似乎是負載 function 帶入 memory 的二進制數據文件,然后其他pykep
函數可以訪問它們(同樣,在引擎蓋下它都是 C++)。
因此,您沒有看到數據顯示為 Python 個變量也就不足為奇了。
現在,至於您的代碼 - 使用類管理數據是一種很好的做法。 您實際上可以在 class 定義 scope 中運行任意代碼,因此我認為以下代碼很有可能起作用:
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 ,但這似乎效率低下。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.