Python中变量的作用域(第4节)


变量是计算机编程中一个重要的概念,是用于存储数据的“容器”,可以存储多种类型的数据,包括数值、字符等。在Python中,变量的作用域是指程序代码能够访问该变量的区域,如果超出该区域,在访问时就会出现错误。变量的作用域其实就是变量的有效范围。变量并不是在哪个位置都可以访问的,访问权限取决于这个变量是在哪里赋值的,也就是在哪个作用域内的。根据作用域的不同,我们将变量划分为局部变量全局变量两种。

1、局部变量

局部变量是指在某个函数内声明的变量,只能在该函数中访问它们,如果试图在超出范围的地方访问,则会出现错误,因为局部变量是在函数体内部临时保存的数据,即当函数调用完成后,局部变量就会被销毁,所以无法在其它范围内被调用。

动手练一练:

def student():
    name = "张三"
    print(name)

student()

执行以上代码,输出结果为:

张三

上面的例子中,函数内正确打印出了“name”变量的内容。“name”是在函数内创建的变量,就是局部变量,不能在函数之外使用此变量,例如:

动手练一练:

def student():
    name = "张三"
    print(name)

student()  # 输出: 张三
print(name)  # 报错,局部变量在函数外部不可访问

执行以上代码,输出结果为:

张三
NameError: name 'name' is not defined

上面的例子中,在函数体student()内的“print(name)”成功执行,但是函数体外的“print(name)”执行失败,Python解释器输出错误信息:“name”没有定义。

不仅仅是在函数体内赋值的变量属于局部变量,函数定义时的参数也属于局部变量,因为参数只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,参数只在函数内部有效,例如:

动手练一练:

def student(x):
    print(x)

student("张三")  # 输出: 张三
print(x)  # 报错,函数student()内声明的参数在函数外部不可访问

执行以上代码,输出结果为:

张三
NameError: name 'x' is not defined

上面的例子中,在函数体student()内的“print(x)”成功执行,但是函数体外的“print(x)”执行失败,Python解释器输出错误信息:“x”没有定义。所以,函数声明时的参数“x”也属于局部变量,不能在函数之外使用此变量。

2、全局变量

全局变量是指在函数外赋值的变量,全局变量可以在整个程序范围内被访问(包括函数内部和函数外部)。例如:

动手练一练:

name = "张三"   # 全局变量
def student():
    print(name)  # 在函数中访问全局变量“name”

student()  # 输出: 张三

执行以上代码,输出结果为:

张三

上面的例子中,函数student()中的“print(name)”被正常执行了,说明在函数体外的全局变量“name”可以正常地在函数体内访问。但是这里需要注意的是,全局变量不允许在函数内部做修改,例如:

动手练一练:

name = "张三"   # 全局变量
def student():
    name = "李四"  # 在函数内部无法修改外部的全局变量“name”
    print(name)

student()  # 输出: 李四
print(name)  # 输出: 张三

执行以上代码,输出结果为:

李四
张三

上面的例子中,在函数student()里面直接把变量name="李四"赋值时,并没有改变函数体外的name="张三"变量。说明如果在函数体内对“name”进行“修改”,并不会修改函数体外的“name”,因为此时函数体内的“name”不是全局变量的修改,而是相当于在函数内部声明了一个新的局部变量,只是名字与函数体外的“name”变量名相同。

如果想对函数体外的全局变量进行修改,我们可以使用“global”关键字声明“name”为全局变量,然后再对变量重新赋值。例如:

动手练一练:

name = "张三"   # 全局变量
def student():
    global name   # 定义“name”为全局变量
    name = "李四"   # 对全局变量重新赋值
    print(name)

student()  # 输出: 李四
print(name)  # 输出: 李四

执行以上代码,输出结果为:

李四
李四

上面的例子中,在函数体student()内修改全局变量“name”为“李四”,函数体外的全局变量“name”也变成了“李四”。所以如果要在函数体内改变全局变量的值,就一定要使用“global”关键字声明一下。