代码之家  ›  专栏  ›  技术社区  ›  notacorn

使用一个函数,但在另一个函数内部修改变量的最佳方法是什么?

  •  1
  • notacorn  · 技术社区  · 7 年前

    def insideAFunction():
        variableToMod =  "test"
    
        def modFunc():
            if 1 > 0:
                variableToMod = "TEST"
    
        print("before: " + variableToMod)
        modFunc()
        print("after: " + variableToMod)
    
    
    def insideAFunction2():
        variableToMod =  "test"
    
        def modFunc():
            global variableToMod
            if 1 > 0:
                variableToMod = "TEST"
    
        print("before: " + variableToMod)
        modFunc()
        print("after: " + variableToMod)
    
    insideAFunction()
    insideAFunction2()
    

    输出:

    before: test
    after: test
    before: test
    after: test
    

    after: TEST
    

    我知道我可以通过定义 variableToMod 在insideAFunction()外部进行全局调用,就像在insideAFunction2()中一样,但是我想知道是否可以完全在函数内部进行调用。

    3 回复  |  直到 7 年前
        1
  •  1
  •   nish    7 年前
    1. 您正在修改modFunc中variableToMod的值,但不返回它。

    所以它总是打印相同的。在打印之前,需要从modFunc返回一个值并将其赋给外部变量tomod。这样的结果是

    前:测试

    def insideAFunction2(): variableToMod=“测试”

    def modFunc():
        if 1 > 0:
            variableToMod = "TEST"
            return variableToMod
    
    
    print("before: " + variableToMod)
    variableToMod = modFunc()
    print("after: " + variableToMod)
    
        2
  •  0
  •   Broseph    7 年前

    您可能正在使用Python3.x(我不认为这在Python2.x中是个问题),这意味着您需要使用 nonlocal 在你的内部函数中。

    global 不起作用,因为您已经定义了一个具有相同名称的局部变量,该名称将隐藏任何具有该名称的全局变量。

    编辑: 实际上,Python2.x确实有同样的行为,但它不支持 非局部的 似乎是这样。我想一个解决方案可能是传入local()字典并在内部函数中更改其中的条目,但我不确定这是否可行。我得试试。

        3
  •  0
  •   Wisang Jati Anggoro    7 年前

    使用返回函数对我很好:

    def insideAFunction():
        variableToMod =  "test"
    
        def modFunc():
            if 1>0:
                variableToMod = "TEST"
                return variableToMod
    
        print("before: " + variableToMod)
        variableToMod = modFunc()
        print("after: " + variableToMod)
    
    insideAFunction()
    

    before: test
    after: TEST