函数
变量的作用域
局部变量
- 定义:在函数内定义的变量叫做局部变量。
- 特点:函数内部的变量作用范围只在函数内,不能在函数外使用。
扩展:
- 局部变量的作用就是临时存储函数内使用的数据。
- 当函数调用完成,或者函数执行结束的时候,函数内所使用的局部变量都会销毁,释放内存。
全局变量(global)
- 定义:在函数外定义的变量,在所有函数中都能使用,
global
- 特点:可以在不同函数内使用或者在函数外使用。
- 注意:在
global xxx
上面不能使用xxx
,即便在函数外定义过xxx
,如下:
num = 100
def modify_value():
num2 = '其他变量可以使用'
print(num2)
# print(num) # 这里不能使用num,因为下面使用了global
# 本意想要修改全局变量的数据
# 本质上是在函数内部定义了一个和全局变量同名的局部变量
global num # 声明要修改全局变量的值,不是定义一个局部变量
num = 200
print("修改后的全局变量的值为:", num)
# 调用函数修改全局变量
modify_value()
# 获取全局变量
print(num)
global关键字本质的扩展(结合“引用”查看)
- global关键字本质上表示要修改全局变量的内存地址;
- 对于可变类型可以在原有数据的基础上修改数据,所以可以不加global,因为没有修改全局变量的内存地址;
- 但可变类型的全局变量重新赋值,需要加上global,因为全局变量内存地址发生了变化;
- 对于不可变类型的全局变量修改数据需要加上global,因为不可变类型不能在原有内存空间的基础上修改数据,因为修改数据后内存地址会发生变化。
总结:对于全局变量不管是可变类型还是不可变类型,只要是重写赋值都需要加上global。
# 定义不可变类型的全局变量
num = 1
def modify_value():
# global 关键字本质上表示要修改全局变量的内存地址
global num
num = 2
print("global全局变量:", id(num), num)
print("全局变量:", id(num), num)
modify_value()
# 定义可变类型的全局变量
my_list = [1]
def modify_value():
# 对于可变类型来说,可以允许在原有内存空间的基础上修改数据,内存地址不变
# 所以不需要加上global
# my_list.append(2) # 内存地址不变
# 而global 关键字本质上表示要修改全局变量的内存地址
# global my_list表示要修改全局变量的内存地址
global my_list
my_list = [3, 4] # 内存地址变了
print("全局变量:", id(my_list), my_list)
print("全局变量:", id(my_list), my_list)
modify_value()
错题
- 以下关于global描述正确的是:( A )
A:使用global可以声明全局变量
B:使用global不可以修改全局变量的指向
C:使用global不可以修改局部变量的指向
D:使用global可以定义全局变量
函数共享数据的方式
- 多个函数共享数据有两种方式:
- 全局变量:全局变量可以在不同函数内共享数据
- 函数的返回值
# 方式一:全局变量
def show1():
global num
num = 200
print("show1函数使用的全局变量:", num)
def show2():
print("show2函数使用的全局变量:", num)
show1()
show2()
# 方式二:函数的返回值
def msg():
result = 50
# 函数通过返回值,可以完成多个函数数据的共享
return result
def show_info1():
# 需要使用msg函数里面的数据
result = msg()
print("共享的数据为:", result)
def show_info2():
# 需要使用msg函数里面的数据
result = msg()
print("共享的数据为:", result)
show_info1()
show_info2()
函数名重复
- 在Python里面不能出现重复的函数名,如果出现了后面的函数将会把前面的函数覆盖,在第二个函数后调用函数,第一个函数不能被执行(当然在第一个函数后,第二个函数前还是可以用的)。
- 这是Python和Java的区别之一:Java中叫函数的重载。
def task():
print("我是一个测试函数")
task() # 此时还可以调用第一个函数
def task(num1, num2):
result = num1 + num2
print("结果:", result)
# 代码到此之后,永远使用不了第一个函数了,只能调用第二个函数
task(1, 2)