【问题标题】:Is input arguments to a function returned always by default?默认情况下总是返回函数的输入参数吗?
【发布时间】:2019-12-27 08:34:34
【问题描述】:

我有一个如下所示的功能。该代码运行良好,我只需要您的帮助来帮助我了解return 或函数输出的存储方式。我是初学者,您的意见会有所帮助

dataFramesDict = dict()

def create_df(xls,s): 
   ......
   return sheet_df,sheet_name

def transform_stage_1_df(sheet_df,sheet_name):
    ..... 
    .....
    return sheet_df,sheet_name

def transform_stage_2_df(sheet_df, sheet_name):

     result = pd.concat(....)
     return result

如您所见,我只返回 result 数据帧作为函数的输出。函数没有返回其他变量

当我按如下顺序调用函数时,我希望它会在dataFramesDict[sheet_name] 的最后一行抛出错误,但它工作正常。

sheet_df,sheet_name = create_df(xls,s)
sheet_df,sheet_name = transform_stage_1_df(sheet_df,sheet_name)
dataFramesDict[sheet_name] = transform_stage_2_df(sheet_df,sheet_name)

我不应该收到如下错误消息吗

sheet_name 未定义

我尝试重新启动内核以确保它没有在其他地方定义。

因为sheet_name 不是全局变量。它仅作为参数传递给上述函数。函数是否也总是默认返回输入参数?

【问题讨论】:

  • 您的问题不清楚。显然,您已经有一个名为 sheet_name 的变量,因为您可以调用将其作为参数传递的函数。为什么你期望解释器引发错误? 重启内核是什么意思?
  • @Selcuk - 如更新后的帖子所示,Sheet_name 作为参数传递,因为它作为另一个函数的输出返回。那么范围不应该只在该函数内有效吗
  • 你在第一行声明sheet_name,使用create_df返回的元组的第二个值。你有什么不清楚的地方?
  • 感谢您的回复。我现在知道了。我只考虑参数,而不考虑用于存储函数输出的输出变量。也许我应该重命名它们并避免重复
  • 以下所有答案都帮助我弄清楚我犯了什么错误并了解变量的范围。感谢您的答复。我将@Devandra Swami 的答案标记为解决方案,因为与其他答案相比,它得到了更多的支持。无论如何,我对这两个答案都投了赞成票

标签: python python-3.x function return return-value


【解决方案1】:

变量 sheet_name 在 transform_stage_2_df 外部定义,因为您将其用作输入参数,因此已在外部定义。

dataFramesDict[sheet_name] = transform_stage_2_df(sheet_df,sheet_name)

【讨论】:

  • 但是我没有把它定义为一个全局变量。这一切都在功能范围内。我做错了什么吗?赞成。
  • 您可以在代码本身中看到 sheet_name 已经在您的函数 transform_stage_2_df 之外定义并指定为您的 create_df 函数的输出参数之一。
  • 这可能是由于您的代码样式,您的函数 transform_stage_2_df 内部和外部的 sheet_name 评估为相同的值。但他们指的是不同的记忆。您可以使用 id(sheet_name) 并在 fn 内部和外部打印,它们将输出不同的值。
  • 好的,所以我们用来存储函数输出的变量可以在任何地方使用。我将它们全部命名为相同的名称是否遵循了不好的做法?
  • 只要对变量的作用域有基本的了解就可以了。您已在调用方命名空间中分配了输出。
【解决方案2】:

sheet_df、sheet_name 和 unit_dict 未在初始问题的行范围内定义。在您对问题的编辑中,您显示了所有这些变量的设置位置。由于它们是在前几行中设置的,因此没有什么神秘之处。

return 不返回参数或将它们放入范围内。

【讨论】:

  • 我已经更新了帖子。有了更多的信息。 Sheet_name 是另一个函数的返回输出,如上所示
  • @SSMK 您调用 create_df() 的行在哪里?
  • 更新了帖子,增加了几行
  • 是的,所以在您添加的行中,sheet_name 已定义。 (出现在等号的左边)
猜你喜欢
  • 2012-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-03
  • 2016-06-17
  • 1970-01-01
相关资源
最近更新 更多