本地范围与非本地范围Python

问题描述 投票:0回答:1

我试图理解 Python 中的作用域,但对下面的示例感到困惑(我使用的是 Python 3.12.2)-

1.

a = 10

def myfunc():
    a = 2
    print(a)

print(a)
myfunc()

这给出了输出 -

10
2
a = 10

def myfunc():
    print(a)

print(a)
myfunc()

这给出了输出 -

10
10
  1. 但是,当我这样做时 -
a = 10

def myfunc():
    print(a)
    a = 2

print(a)
myfunc()
UnboundLocalError: cannot access local variable 'a' where it is not associated with a value

我不确定这与代码示例 1 有什么不同。为什么我的输出不是 -

10
10
python scope
1个回答
0
投票

您观察到的行为与 Python 如何处理函数内的变量范围和赋值有关。让我们分解每个示例并解释发生了什么。

在示例 1 中,

a = 10
是一个全局变量。当您在 myfunc() 中定义 a = 2 时,您将创建一个新的局部变量 a ,该变量遮盖了函数作用域内的全局 a 。因此,当你在 myfunc() 中打印 a 时,它指的是本地 a,即 2。

在第二个示例中,myfunc() 中没有定义局部变量 a。因此,当您打印 a 时,Python 在外部作用域(本例中为全局作用域)中查找 a 的值,并两次打印 10。

在第三个示例中,您会遇到 UnboundLocalError,因为当 Python 编译函数 myfunc() 时,它发现您正在为函数内的 a 赋值,因此它将 a 视为整个函数范围内的局部变量。但是,当在定义 a 之前调用 print(a) 时,Python 不知道您指的是哪个 a,因为尚未分配局部变量 a。因此,它也无法访问全局 a,因为 Python 假定 a 是局部的,因为函数后面发生了赋值 a = 2。

Python 作用域规则是,如果在函数作用域内的任何位置对变量进行赋值,则在整个函数中它将被视为局部变量,即使赋值是在引用变量之后发生的。

© www.soinside.com 2019 - 2024. All rights reserved.