作用域
全局变量&局部变量
全局变量和局部变量都是在讨论无参数的函数,不要把全局变量和局部变量与函数的参数混淆了。
1.1 函数会在函数域中找变量(局部变量),如果函数内部没有定义该变量,则会在全局中寻找变量(全局变量)
a=100
def test1():
print(a) # 输出结果100,函数域里没有a,所以去全局寻找
def test2():
a=200
print(a) # 输出结果为200,函数域里有a,所以取函数域里面的值
1.2 当一个函数使用了全局变量时,就不能再在函数域中修改同名变量,因为这个操作是在修改全局变量
a=100
def test1():
print(a)
a=200 # 此处不可以修改全局变量
print(a)
test1()
UnboundLocalError: local variable 'a' referenced before assignment
如果想要修改全局变量,要先用global声明
a=100
def test1():
global a
print(a)
a=200 # 这里变成修改全局变量
print(a) # 输出结果为200,
1.3 之所以不能修改全局变量,是因为局部作用域不能修改全局变量的指向,正是因为这个原因,所以对列表等可变的类型,可以不用声明就可以修改全局,因为没有更改其指向,而是修改了内容。
a=[1]
def test1():
a.append(1)
print(a)
Python 使用 LEGB 的顺序来查找一个符号对应的对象
locals -> enclosing function -> globals -> builtins
- locals,当前所在函数、模块
- enclosing,外部嵌套函数的命名空间(闭包中常见)
- globals,全局变量,函数定义所在模块的命名空间
- builtins,内建模块的命名空间
返回值(return)
可以使用list tuple dict 或者直接用,将多个结果同时返回(本质是tuple)
其他
匿名函数:
lambda [arg1 [,arg2,…argn]]:expression
冒号:后面相当于return返回
函数作为参数
当函数作为参数时,是把函数的引用传入到了函数里
def name(a,b,func)
字符串转函数
字符串转表达式
eval() 结合eval input可以给python传入function