一、局部变量与全局变量
1、在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。
全局变量没有任何缩进,在任何位置都可以调用。
子程序:如用def定义的函数。
作用域
一个标识符的可见范围,这就是标识符的作用域。一般常说的是变量的作用域
全局作用域(global):在整个程序运行环境中都可见
局部作用域:在函数、类等内部可见;局部变量使用范围不能超过其所在的局部作用域。
例子
NAME = "nicholas"
def change_NAME():
print("change_NAME", NAME)
change_NAME()
print(NAME)
输出结果
change_NAME nicholas
nicholas
分析:NAME = "nicholas"就是全局变量,在
change_NAME()函数体内可以直接调用打印出“change_NAME nicholas”
2、当全局变量与局部变量同名时:
在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。
例子:
NAME = "nicholas"
def change_NAME():
NAME = "niubi"
print("change_NAME", NAME)
change_NAME()
print(NAME)
输出结果
change_NAME niubi
nicholas
分析:当全局变量与局部变量同名时:在 def change_NAME():函数内部,
执行print("change_NAME", NAME)语句时,这里的NAME优先调用函数内部的值,函数执行结束后执行print(NAME)语句,全局变量NAME = "nicholas"起作用。
3、如果函数内部无global关键字
优先读取局部变量,如果没有局部变量则读取全局变量,此时无法对全局变量进行赋值。
但是对于可变对象可以对内部元素进行操作(如append()pop()).
大前提:无global关键字
a、有声明(同名)局部变量
例子
name = ["pony","jack"]
print(1,name)
def change_name():
name = "nicholas"
print("change_name", name)
change_name()
print(2,name)
输出结果
1 ['pony', 'jack']
change_name nicholas
2 ['pony', 'jack']
1 ['pony', 'jack']
change_name nicholas
2 ['pony', 'jack']
分析:这里无golbal关键字,执行 print(1,name)语句时读取全局变量name = ["pony","jack"],之后执行change_name()函数,在函数里面nema被赋值为"nicholas"
执行print("change_name", name)语句,这里的name优先读取函数内部的局部变量name = "nicholas"
输出change_name nicholas。之后change_name()函数结束。
执行print(2,name)语句。这里仍然读取全局变量name = ["pony","jack"]。
b、无声明(同名)局部变量
例子
name = ["pony","jack"]
print(1,name)
def change_name():
print(3, name)
name.append("nicholas")
print(4,name)
change_name()
print(2,name)
输出结果
1 ['pony', 'jack']
3 ['pony', 'jack']
4 ['pony', 'jack', 'nicholas']
2 ['pony', 'jack', 'nicholas']
分析:无global关键字,针对全局变量如果是可变对象,可以对内部元素进行操作。
4、如果函数中有global关键字,变量本质上就是全局变量,可读取可赋值。
a、有声明(同名)局部变量
例子
NAME = "nicholas"
print(1,NAME)
def change_NAME():
global NAME
NAME = "niubi"
print("change_NAME", NAME)
change_NAME()
print(2,NAME)
输出结果
1 nicholas
change_NAME niubi
2 niubi
分析:在执行print("1",NAME)语句时,NAME使用全局变量,然后执行change_NAME()函数,在函数