python为什么可以在主作用域中声明而不是glob的函数中使用变量

2024-04-27 09:01:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近注意到一些我在python中没有想到的事情,可以检查/访问在主作用域中声明的函数中的变量,例如:

def my_func(mval):
    print ("parameter:", mval)
    print ("myvar:", myvar)
    #myvar = "value" this is not allowed

print ("IN MAIN")
myvar = "123"
my_func(999)

输出:

IN MAIN
parameter: 999
myvar: 123
  1. 为什么my_func可以访问myvar?那为什么它失败了呢 试图更改值?你知道吗
  2. 有没有办法阻止这种行为, 所以在这种情况下,它会说变量myvar没有定义?你知道吗

我知道我们可以使用global来实现这一点,这是有意义的,因为我们明确地说在我们想要访问的函数范围之外有一个变量。你知道吗

我觉得这很棘手,因为它可能会导致错误。。你知道吗


Tags: 函数in声明parametervaluemainmydef
3条回答

myvar在全局范围内,因此无论您是否声明它,它都是全局的。读取时,python查看函数的局部作用域,然后返回到定义变量的模块全局作用域。编写python时有一个问题。它应该在局部函数作用域还是全局作用域中分配变量?在函数中使用global关键字并告诉该函数如何解决该问题。变量从不声明为全局变量,函数被告知将该变量视为全局变量。你知道吗

def my_func(mval):
    global myval
    myval = 'foo'  # set in global scope
    myval2 = 'bar' # set in local scope

当您定义函数时,只对语法的正确性进行而不是评估,因此不会引发任何问题。一旦调用函数myvar就已经在全局范围内定义了,因此该函数是有效的。另外,如果取消注释myvar = 'value'my_func,只要在调用函数之前定义了myvar,那么my_func也将毫无例外地进行计算。你知道吗

当您在my_func中显示myvar的内容时,它将检查全局变量表,查看它是否以前在执行中定义过,这就是它工作的原因。然后,当您试图在函数中通过取消对myvar = "value"的注释来为它赋值时,它会尝试将myvar定义为my_func的局部变量,这会隐藏对myvar全局实例的引用。你知道吗

我不确定使用global关键字会导致什么问题,但它应该按预期工作。下面是一个如何使用它的示例:

def my_func(mval):
    global myvar
    print ("parameter:", mval)
    print ("myvar:", myvar)
    myvar = "value"

print ("IN MAIN")
myvar = "123"
my_func(999)
print("myvar after my_func:", myvar)

输出:

IN MAIN
parameter: 999
myvar: 123
myvar after my_func: value

如果您真的不想使用global关键字,可以通过将myvar作为my_func的参数传递来实现所需的行为,并返回修改后的值以在主作用域中重新分配它:

def my_func(mval, myvar):
    print ("parameter:", mval)
    print ("myvar:", myvar)
    myvar = "value"
    return myvar

print ("IN MAIN")
myvar = "123"
myvar = my_func(999, myvar)
print ("myvar after my_func:", myvar)

输出:

IN MAIN
parameter: 999
myvar: 123
myvar after my_func: value

如果已经构建了my_func来返回一个值,请记住,在Python中可以返回多个值。因此,假设my_func将返回一个名为returnvar的变量,上面的代码可以写成:

def my_func(mval, myvar):
    returnvar = mval + 1
    print ("parameter:", mval)
    print ("myvar:", myvar)
    myvar = "value"
    return myvar, returnvar

print ("IN MAIN")
myvar = "123"
myvar, returnvar = my_func(999, myvar)
print ("myvar after my_func:", myvar)
print ("returnvar:", returnvar)

输出:

IN MAIN
parameter: 999
myvar: 123
myvar after my_func: value
returnvar: 1000

相关问题 更多 >