【问题标题】:Python - imported function doesn't modify local variablePython - 导入的函数不会修改局部变量
【发布时间】:2019-09-25 10:28:16
【问题描述】:

我有一个 python 脚本 (myscript.py),其中包含许多函数和一个名为“resultsdict”的全局变量(一个空字典)。我想重用其中一个函数 (myfunc)。

myfunc 接受单个输入 (input),创建字典 (tempdict),然后更新 resultsdict (key = input, value = tempdict)。我通常通过循环列表来使用这个函数,调用列表的每个成员作为输入。

resultsdict = {}
mylist = [1,2,3]
for x in mylist:
    myfunc(x)
print(resultsdict)
{1:{dict of results-1},2:{dict of results-2},3:{dict of results-3}}

我想在第二个脚本 (script2.py) 中重用 myfunc。 script2.py 还包含一个名为 resultsdict 的全局变量。当我将 myfunc 导入 script2 并运行它时,resultsdict 变量没有更新。

from myscript import myfunc
resultsdict = {}
mylist = [1,2,3]
for x in mylist:
    myfunc(x)
print(resultsdict)
{}

任何帮助将不胜感激

【问题讨论】:

  • 但你没有从 myfunc 返回任何内容,而且在其中你重新声明 resultsdict = {} 所以每次你调用它设置 resultsdict = {} 的函数。能否请您显示所有代码并举例说明预期结果?
  • myfunc 将更新resultsdict 变量在其范围中的任何内容。这根本不是它的工作原理。你要么想使用一个类,要么明确地接受和返回值。
  • myfunc 没有返回任何东西是正确的。每次我调用它设置 resultsdict = {} 的函数是不正确的 - 分配是在脚本的主体中完成的,而不是在函数内

标签: python


【解决方案1】:

我猜你在myfunc 的全局范围内修改了resultsdict。 尝试更改此行为以通过属性传输resultsdict

def myfync(x, resultsdict):
...

或添加关于 resultsdict 来自全局范围的行(更糟糕的方式):

def myfync(x):
    global resultsdict
...

并且以任何方式修改某些函数中的可变对象都是不好的方式。

【讨论】:

    【解决方案2】:

    也导入结果字典。 然后,如果您想复制。

    from myscript import myfunc, resultsdict
    
    mylist = [1,2,3]
    for x in mylist:
        myfunc(x)
    print(resultsdict)
    

    【讨论】:

      【解决方案3】:

      在您的 for 语句中,您使用“list”,但在之前的行中,您声明了“mylist”! 注意:没有“列表”,这就是您的代码不起作用的原因。

      如下编辑你的 for 语句:

      for x in my mylist:
          ...
      

      【讨论】:

      • 这是我的伪代码中的一个错字。更新了原始帖子以修复
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-03
      • 2018-06-23
      • 2021-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多