![](/img/trans.png)
[英]Python instance of class defined inside a method is still able to use local variables inside the method when called outside the method
[英]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_data
和b
引用完全相同的數據。 沒有副本。
這很有用,可以節省內存,但是您需要注意,您正在使用對相同數據的標簽(引用)。 如果希望a.some_data
和b
是數據的單獨實例,則需要顯式復制數據。
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.