【问题标题】:Simple function problem, local variable referenced before assignment简单函数问题,赋值前引用的局部变量
【发布时间】:2020-07-25 09:19:20
【问题描述】:

我对编码非常陌生,并且在使用功能时遇到了麻烦。这有什么问题,我该如何正确地做到这一点?

x = 0
def function():
    x = x + 1
    return(x)
x = 2
x = function()
print(x)

【问题讨论】:

    标签: python function


    【解决方案1】:

    如果您在函数中修改(绑定)变量anywhere,除非明确声明globalnonlocal,否则该变量在该函数中被视为本地everywhere sup>(a)。 Python execution model 涵盖了这一点:

    如果名称绑定在块中,则它是该块的局部变量,除非...

    换句话说,你所拥有的是有效的:

    x = 0
    def function():
        local_x = local_x + 1 # use of unitialised local_x
        return(local_x)
    

    这意味着你需要类似的东西:

    x = 0
    def function():
        global x
        x = x + 1 # use of initialised x
        return(x)
    

    但是,请记住,全局变量大多是错误的做事方式。它们对于小型程序可能没问题,但当您达到一定的复杂程度时,它们可能会成为一场噩梦。

    一种方法是只传入变量并传回修改后的值,在调用者中重新分配它:

    def function(value):
        return value + 1
    
    def caller():
        non_global_x = function(non_global_x)
    

    请注意,non_global_x可能在这种情况下仍然是全局变量,但它也可以是任何其他合适的变量,例如对象的成员。


    (a) 两者的区别在于global 表示全局,意味着它可以在任何地方使用。非局部变量只是指层次结构中某处的变量,但您可能会在进入全局范围之前找到它们(通常用于嵌套函数)。

    【讨论】:

    • 嘿,感谢您的详细回答,但您介意给我一个替代全局变量但仍在使用函数的示例吗?
    【解决方案2】:

    如果要分配位于函数外的变量,请将函数更改为此:

    def function():
        global x
        x = x + 1
        return x
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-02
      • 2011-11-06
      • 2018-01-12
      • 1970-01-01
      相关资源
      最近更新 更多