簡體   English   中英

存儲在Python中的方法內部定義的數據幀和變量

[英]Storage of dataframes and variables defined inside a method in Python

如果某個類方法在該類的對象調用該方法時在其中創建了數據框架,則該數據框的數據在執行該方法后是否會保留?

以下面的代碼為例:

class some_class():
      def some_method(self):
            some_data = pd.DataFrame({"a":[1,2,3,4],
                                      "b":[5,6,7,8]
                                      })
            return some_data

a = some_class()
b = a.some_method()

在執行對a.some_method()的調用之后,數據幀將存儲在對象中嗎?

我希望能夠創建多個對象,並根據這些對象中定義的方法使用它們返回數據,但我擔心如果對象也存儲了數據,那么實際上我將兩次存儲相同的數據(在上面的示例中的數據幀b和對象a中)。

如果要在類中存儲值,則必須將方法分配給self 例如:

class some_class():
      def some_method(self):
            self.some_data = pd.DataFrame({"a":[1,2,3,4],
                                           "b":[5,6,7,8]
                                          })
            return self.some_data

a = some_class()
b = a.some_method()

這會將一個“標簽”存儲到您的some_class實例中的數據上(如果您要遵循流行的慣例,則應將其大寫為SomeClass btw),並帶有標簽some_data 變量b也是該數據的別名a.some_datab引用完全相同的數據。 沒有副本。

這很有用,可以節省內存,但是您需要注意,您正在使用對相同數據的標簽(引用)。 如果希望a.some_datab是數據的單獨實例,則需要顯式復制數據。

Python變量的行為與許多其他流行語言不同。 變量的名稱,例如b ,實際上只是附加到某個值的標簽。 因此,如果您分配c = b ,那么您還沒有復制數據,您只是為原始值分配了一個新標簽。 對於諸如原始數值類型之類的不可變類型,這與復制值沒有太大區別,但是對於更復雜的類型(列表,字典,數據框等),您需要意識到您正在使用標簽。

您不會做的類,因為您擁有self而沒有__init__ ,因此:

class some_class():
      def some_method():
            some_data = pd.DataFrame({"a":[1,2,3,4],
                                      "b":[5,6,7,8]
                                      })
            return some_data

print(some_class.some_method())

輸出:

   a  b
0  1  5
1  2  6
2  3  7
3  4  8

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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