为什么调用函数后全局变量没有更新?

时间:2019-04-01 03:28:38

标签: python pandas function dataframe global-variables

我创建了几个函数,这些函数从github加载数据集,然后将其组合。这部分代码正常工作。当我第二次运行Combine函数时,出现了我的问题。

在测试我的功能是否按预期工作时尝试的操作。

loadDataset("https://raw.githubusercontent.com/AAF108/ml/master/test3")
print (dataset)
combine({"data": [{"room_temperature": 20, "light_intensity": 
511,"humidity": 50}]})
print(combinedData)

loadDataset中的URL是这样:

{"data": [{"room_temperature": 20, "light_intensity": 511,"humidity": 50}]}

运行此部分时,我得到了(这是我期望得到的):

   humidity  light_intensity  room_temperature
0        50              511                20


   humidity  light_intensity  room_temperature
0        50              511                20
0        50              511                20

下面是我做的功能的代码:

def loadDataset(url):
    global dataset
    dataset = pd.read_json(url)

def combine(obj):
    global combinedData

    json= obj

    df1 = pd.DataFrame(dataset)
    df2 = pd.DataFrame(json["data"])

    combinedData = pd.concat([df1, df2])

这样做会引起我的问​​题:

loadDataset("https://raw.githubusercontent.com/AAF108/ml/master/test3")
print (dataset)
combine({"data": [{"room_temperature": 20, "light_intensity": 
511,"humidity": 50}]})
print(combinedData)
combine({"data": [{"room_temperature": 20, "light_intensity": 
511,"humidity": 50}]})
print(combinedData)

我期望什么:

   humidity  light_intensity  room_temperature
0        50              511                20


   humidity  light_intensity  room_temperature
0        50              511                20
0        50              511                20
0        50              511                20

我得到的是:

   humidity  light_intensity  room_temperature
0        50              511                20


   humidity  light_intensity  room_temperature
0        50              511                20
0        50              511                20

我不确定我的CombineData为什么不更新。

1 个答案:

答案 0 :(得分:1)

global的工作方式不是这样。而是将名称 combinedData作为引用全局定义对象的局部变量“导入”到您的函数中。

因此,因此,当您运行combinedData = pd.concat([df1, df2])时,会将pd.concat([df1, df2])的结果分配给 local 变量combinedData 。这种变化显然在全球范围内是不可见的。

您应避免以这种方式使用全局变量,而应将对象作为参数传递。

如果您确实要这样做,尽管...您可以做类似的事情(编辑:这实际上是行不通的,因为pd.append不能就地工作):

combinedData = pd.DataFrame()

def combine(obj):
    global combinedData

    json = obj

    df1 = pd.DataFrame(dataset)
    df2 = pd.DataFrame(json["data"])

    combinedData.append(pd.concat([df1, df2]))

感谢发表评论,我进行了更多测试,发现 real 原因是OP的代码无法正常运行:运行时环境。

如果您以 script 身份运行此代码,则它会修改全局变量combinedData。但是,如果您在 Jupyter笔记本中运行它,则不会。