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

问题描述 投票:-1回答:1

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

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

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没有更新。

python pandas function dataframe global-variables
1个回答
1
投票

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

因此,当你运行combinedData = pd.concat([df1, df2])时,你将pd.concat([df1, df2])的结果赋给局部变量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]))

感谢评论,我做了一些测试,我发现OP的代码不起作用的真正原因是:运行时环境。

如果您将此代码作为脚本运行,那么它会修改全局变量combinedData。但是,如果您在Jupyter笔记本中运行它,那么它不会。

© www.soinside.com 2019 - 2024. All rights reserved.