函数

变量的作用域

局部变量

  • 定义:在函数内定义的变量叫做局部变量。
  • 特点:函数内部的变量作用范围只在函数内,不能在函数外使用。
扩展:
  • 局部变量的作用就是临时存储函数内使用的数据。
  • 当函数调用完成,或者函数执行结束的时候,函数内所使用的局部变量都会销毁,释放内存。

全局变量(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关键字本质的扩展(结合“引用”查看)
  1. global关键字本质上表示要修改全局变量的内存地址;
  2. 对于可变类型可以在原有数据的基础上修改数据,所以可以不加global,因为没有修改全局变量的内存地址;
  3. 但可变类型的全局变量重新赋值,需要加上global,因为全局变量内存地址发生了变化;
  4. 对于不可变类型的全局变量修改数据需要加上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()
错题
  1. 以下关于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)