“无法访问未与值关联的局部变量‘a’”,但该值已定义

Oli*_*lar 28 python

我不知道为什么当a位于def test()它时找不到并给出错误

UnboundLocalError:无法访问未与值关联的局部变量“a”

代码

import keyboard
import time

a = 0

def test():
    a+= 1
    print("The number is now ", a)
    time.sleep(1)

while keyboard.is_pressed('i') == False:

    test()

Run Code Online (Sandbox Code Playgroud)

我尝试在 内部设置aglobal a或使用修饰符,但它似乎不起作用。有没有办法让它识别并正常运行?nonlocaldefa

MSH*_*MSH 30

Python 变量是基于范围的。这意味着无法访问函数内部声明的值。但您可以访问在函数外部声明的变量。

这会失败:

def func():
    a = 1

func()
print(a)
Run Code Online (Sandbox Code Playgroud)

这将打印1

def func():
    print(a)

a = 1
func()
Run Code Online (Sandbox Code Playgroud)

请注意您可以访问它。如果你想更新它,你就会失败。

这也会失败:

def func():
    a = a + 1
    print(a)

a = 1
func()
Run Code Online (Sandbox Code Playgroud)

a您需要告诉解释器在全局范围内查找变量。

def func():
    global a
    a = a + 1
    print(a)

a = 1
func()
Run Code Online (Sandbox Code Playgroud)

警告:使用变量不是一个好的做法global。因此最好确保该函数正在获取值。

def func(a):
    a = a + 1
    print(a)

a = 1
func(a)
Run Code Online (Sandbox Code Playgroud)


小智 5

要访问函数内的全局变量,必须使用 global 指定它。否则,函数内的变量是局部变量,仅在该函数内有用。这就是为什么您会收到错误:“UnboundLocalError:赋值之前引用了局部变量'a'”。在函数内部,您还没有定义变量“a”,无论是本地变量还是全局变量。

import keyboard
import time

a = 0

def test():
    global a
    a+= 1
    print("The number is now ", a)
    time.sleep(1)

while keyboard.is_pressed('i') == False:
    
    test()
Run Code Online (Sandbox Code Playgroud)

  • 可以从函数访问全局变量,但不能更新该值。 (8认同)
  • @MSH 你能解释一下为什么会出现这种情况吗? (2认同)
  • @MSH:这是错误的,你**可以**修改函数内的全局变量。 (2认同)

小智 3

您需要将 a 传递给功能测试。Python 将a函数中的 视为局部变量。这将起作用:

import keyboard
import time
a = 0
def test(a=a):
    a+= 1
    print("The number is now ", a)
    time.sleep(1)
while keyboard.is_pressed('i') == False:
    test()
Run Code Online (Sandbox Code Playgroud)