簡體   English   中英

python的“內存中”變量如何工作

[英]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)而不會出現任何錯誤。但是,如果我在其他地方定義它或嘗試移動它,情況就不是這樣了。

例如:

示例 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

在函數的本地 scope 內部我可以使用asteroid.eph(epoch)但在外部我需要重新執行第一行。 這是有道理的。 但是,為什么不能返回到全局scope。

示例 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 方法的第一行,也沒有加載 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM