全局变量,局部变量
函数内部定义的变量为局部变量,程序中函数外部定义的为全局变量,
- 同名时,id不同。
- 全局变量作用于整个程序
- 局部变量只在定义的函数内起作用
- 局部变量可以调用全局变量,但不能修改全局变量,如果修改,函数内部最上方加 global,先声明再修改,不然报错。global不建议用。
- 全局变量不能调用局部变量
- 局部变量与局部变量之间是独立的,不能相互引用
- 全局变量是列表,字典,元组,被修改的是某个元素,整体的不能被修改。
name = '小明'
def n():
name ='小红'
print(name)
n() # 小红
print(name) # 小明
names=['x','y','z']
def change():
names=['a','b','c']
print(names)
change()
print(names)
# ['a', 'b', 'c']
# ['x', 'y', 'z']
names=['x','y','z']
def change():
del names[2]
print(names)
change()
print(names)
# ['x', 'y']
# ['x', 'y']
嵌套函数
函数内部再定义函数就是嵌套函数,函数定义之后要执行就必须调用。
def func1():
print('小明')
def func2():
print('小红')
func1() #小明
def func1():
print('小明')
def func2():
print('小红')
func2() # 调用
func1()
# 小明
# 小红
嵌套函数变量查找几种情况:
1、内层函数引用变量一层一层外找。
age=19
def func1():
age=20
print(age)
def func2():
age = 21
print(age)
func2()
func1()
# 20
# 21
age=19
def func1():
age=20
print(age)
def func2():
print(age)
func2()
func1()
# 20
# 20
2、
age=19
def func1():
def func2():
print(age)
age=20 # 在函数func1已经定义了,func2()执行时已经存在。
func2()
func1()
# 20
3、
age=19
def func1():
def func2():
print(age)
func2()
age = 20 # 报错
func1()
age=19
def func1():
global age # 添加global之后,func2执行age19,
# 更改全局变量age更改全局变量age
def func2():
print(age)
func2()
age = 20
func1() # 19
4、
python中一个函数就是一个作用域,局部变量放置在其作用域中
代码定义完成后,作用域已经生成,作用域链向上查找,函数名是可以当成返回值的!
age=19
def func1():
global age
def func2():
print(age)
age = 20
func2()
func1()
print(age)
# 20
# 20
age=19
def func1():
age=73
def func2():
print(age)
return func2
val=func1()
val()
# 73
闭包
对嵌套函数而言,每当外部函数被调用时,都将重新定义内部的函数,并返回内部的函数对象。当内部函数执行时,可以访问这个来自外部函数局部作用域的变量。
def func(num):
def func2(num2):
return num * num2
return func2
x=func(3) # 返回func2,函数对象,没有执行func2,加括号时执行。
print(x(2)) # x(2)执行时,依然可以访问到外部函数func定义的作用域里的变量num=3
# 6
y=func(5)
print(y(6))
# 30
函数func每次被调用时都会重新定义func2,并返回func2函数对象并包裹func定义的作用域。
嵌套函数func2在外部函数之外调用时,它依然可以访问到作用域之内的局部变量。