Python通过引用

时间:2017-11-07 09:10:45

标签: python oop

import pandas as pd

class MyClass():
    def __init__(self, df):
        self.df = df

    def edit(self):
        self.df = self.df[~self.df['numbers'].isin([2,4,6,8,10])]

df = pd.DataFrame([1,2,3,4,5,6,7,8,9,10], columns=['numbers'])
obj = MyClass(df).edit()
print df

我希望print df能够打印在过滤功能之后重新分配的数据帧。

但是这个stil会打印出edit函数修改它之前的数据帧。

我的外部变量如何仍然跟踪发生在类{<1}}内的更改

3 个答案:

答案 0 :(得分:1)

  

我的外部变量如何仍然跟踪发生在类

中的df的更改

你试图这样做的方式,即通过重新分配,这是不可能的。名字不会“看到”其他名称的重新分配(如果他们这样做,可以想象灾难)。

这里唯一没有重新分配df的机会是 mutate 数据帧。您目前所做的只是创建一个新对象并重新分配self.var。你班级以外的var并不关心这一点,仍然指向旧的对象。

当然,明智的做法是将df重新分配给某些功能或方法的返回值,即:

def compute_new_df_from_old_df(df):
    return df.foo()[bar]

df = <some dataframe>
df = compute_new_df_from_old_df(df)

答案 1 :(得分:1)

尝试将代码重写为:

df = pd.DataFrame([1,2,3,4,5,6,7,8,9,10], columns=['numbers'])
obj = MyClass(df)
obj.edit()
print obj.df

答案 2 :(得分:0)

不可变对象不是通过引用传递的(在技术上,neither are mutable objects)。您有什么特别的理由要这样做吗?