变量的作用域其实就相当于变量的命名空间,赋值过的变量并不是在哪里都可以使用的。如何定义变量决定了变量可以在哪里被使用。 Python中变量赋值的位置决定了哪些范围的对象可以访问这个变量,这个范围就被称为作用域。
Python中有两种最基本的变量作用域:局部变量和全局变量。
局部变量
一般情况下,在函数内赋值的变量,不做特殊声名的都是局部变量。顾名思义,局部变量的作用域是局部的,在当前函数赋值则只能在当前函数使用。
如果在函数体中第一次出现的,就是局部变量,例如:
def foo():
x = "hello"
print(x)
foo()
执行结果如下:
hello
可以看到,函数内正确打印出了“x”变量的内容。“x”是在函数体内被赋值的,所以“x”是局部变量。局部变量只能在函数体内被访问,超出函数体的返回就不能正常执行,例如:
def foo():
x = "hello"
print(x)
foo()
print(x)
执行结果如下:
hello
NameError: name 'x' is not defined
从执行结果中我们可以发现:在函数体内的“print(x)”成功执行,但是函数体外的“print(x)”执行失败,并且收到错误信息:“x”没有定义。
不只在函数体内赋值的变量是局部变量,函数定义时的参数也是局部变量,例如:
def foo(x):
print(x)
foo("hello")
print(x)
执行结果如下:
hello
NameError: name 'x' is not defined
可以看到,这个例子和上一个例子都得到了相同的结果:在函数体内的“print(x)”成功执行,但是函数体外的“print(x)”执行失败,并且收到错误信息:“x”没有定义。这说明函数声名时的参数也是局部变量,只能在函数体内使用。
全局变量
在函数外赋值的变量就是全局变量,全局变量可以在整个程序范围内被访问。例如:
x = "hello"
def foo():
print(x)
foo()
执行结果如下:
hello
从执行结果可以发现,函数foo中的“print(x)”被正常执行了,说明在函数体外的变量可以正常地在函数体内访问。但是,函数体内的重新赋值的相同函数名字变量并不会改变函数体外的全局变量,例如:
x = "函数体外"
def foo():
x = "函数体内"
print(x)
foo()
print(x)
执行结果如下:
函数体内
函数体外
从执行结果中我们可以发现,函数foo对“x”进行赋值操作时并没有改变函数体外的“x”变量。说明如果在函数体内对“x”进行“修改”(其实是创建了一个新的变量,只是名字与函数体外的“x”变量相同),并不会修改函数体外的“x”。
如果想对函数体外的变量进行修改,我们可以使用“global”关键字,例如:
x = "函数体外"
def foo():
global x
x = "函数体内"
print(x)
foo()
print(x)
执行结果如下:
函数体内
函数体内
从执行结果可以发现,在函数体内修改全局变量“x”为“函数体内”,函数体外的全局变量“x”也变成了“函数体内”。所以如果要在函数体内修改全局变量,就一定要添加“global”关键字。