Python 局部变量和全局变量

在python开发中,变量也是有生命周期的,一旦周期结束,程序会自动清理暂用的空间,释放内存,变量分为两者,一种是局部变量,一种是全局变量,两者具体有什么区别呢……

 

没听清楚

 

一.局部变量

一般而言在函数内部或者类中声明的变量默认都是局部变量。一旦函数结束,变量的生命周期也会结束,占用的空间会被自动释放。

def func1():
    # 在函数内部定义的变量默认都是局部变量
    a = 1
    print(a)
    # 函数结束,局部变量a的生命周期结束

# 由于a是局部变量,并且a的生命周期已经结束,外部再次调用局部变量a,程序会产生异常,崩溃
print(a)

程序报错:NameError: name ‘a’ is not defined ,原因:函数内部定义的局部变量只能在函数内部使用。

 

二.全局变量

全局变量和局部变量相反,在函数外部或者类外部声明的变量默认为全局变量。全局变量的生命周期直到程序结束才会结束,比局部变量生命周期更长。

a = 2
def func1():
    print(a)
    # 函数结束,局部变量的生命周期结束
    # 全局变量直到程序结束,生命周期才结束

func1()
# 输出全局变量a
print(a)

输出结果:

2
2

 

三.局部变量和全局变量的区别

1.全局变量的生命周期是直到程序结束,而局部变量生命周期是函数结束;

2.如果需要在函数内部修改全局变量的值,需要在函数内部为该全局变量前面加上 global 关键字, 否则该变量默认为函数内部定义的局部变量,示例代码如下:

# !usr/bin/env python
# -*- coding:utf-8 _*-

# 在函数内部定义的变量默认都是局部变量
a = 2
def func1():
    # global a # 声明 a 是全局变量,在该函数内部对a的操作就是对全局变量a的操作
    a = 1      # 如果没有上一行代码,默认a就是函数内部的局部变量,函数结束,生命周期结束
    print(a)
    # 函数结束,局部变量的生命周期结束


func1()
# 输出全局变量a
print(a)

输出结果:

1
2

是不上觉得很奇怪:为什么最后一个值是2,应该是1才对?

因为没有第17行代码的话,默认a只是函数内部的一个普通局部变量,所以函数内部的print函数输出到控制台是1;函数结束,函数内部的局部变量a值生命周期结束,执行fun1函数之后的print函数输出的是全局变量a的值2.

也就是说函数内部对a值得修改并没有成功,只有在函数内部,为全局变量加上关键字global声明为全局变量,才能修改成功,取消第17行得注释,控制台输出:

1
1

 

思考

 

再解析

# 如果函数内无global关键字,优先读取局部变量,无局部变量则读取全局变量,不能对全局变量重新赋值

name = "Jack"

def change_name():

name = "Rose"
print(name)

change_name()
print(name)

 

输出为 

Rose

Jack

 

 

# 如果函数中有global关键字,可以读取或者重新给全局变量赋值

name = "Jack"

def change_name():

global name

name = "Rose"
print(name)

change_name()
print(name)

 

输出

Rose

Rose

 

 

# 修改全局变量和修改上一级变量 -- 修改全局变量
name = "Jack"

def one():
name = "Tom"

def two():
global name #定义全局变量
name = "Rose"
print(name)
two()
print(name)

print(name)
one()
print(name) #定义全局变量

 

输出

Jack

Rose

Tom

Rose

 

 

# 修改全局变量和修改上一级变量 -- 修改上一级变量
name = "Jack"

def one():
name = "Tom"

def two():
nonlocal name # 修改上一级变量
name = "Rose"
print(name)
two()
print(name) # 修改上一级变量

print(name)
one()
print(name)

 

输出

Jack

Rose

Rose

Jack

 

# 关于函数调用时的可变对象的使用
#对于可变对象可以对内部元素进行操作,相当于传引用
name = ["Jack","John"]
def change_name():
name.append("Tom")
print(name)

change_name()
print(name)

 

['Jack', 'John', 'Tom']

['Jack', 'John', 'Tom']

 

 

四.重点总结

1.注意局部变量和全局变量的生命周期;

2.如果想在函数内部修改全局变量的值,需要加上关键字global;

 

引用  shuopython