函数的参数传递
一、本质
从动态类型看函数的参数传递, 函数的参数传递,本质上传递的是引用
传递可变对象:
在定义参数时,尽量避免参数的默认值设置成一个可变对象
def f(a=[]):
a.append(1)
print(a)
f()
f()
f()
# 每一次调用函数都会改变参数的值
# [1]
# [1, 1]
# [1, 1, 1]
二、变量的空间作用域
2.1 不可变数据类型
def func1(x):
print(x)
# 局部变量
x = 100
print(x)
# 全局变量
x = 1
func1(x)
print(x)
# 1
# 100
# 1
2.2 可变数据类型
由于函数传递参数的本质是传递引用,所以在自身做修改,会影响全局变量a
def f(x):
x[0] = 100
print(x)
a = [1,2,3]
f(a)
print(a)
# [100, 2, 3]
2.3 变量的作用域
2.3.1 变量名的解析(LEGB)
1.在本地变量中找 – local
2.在任意上层函数中找 – enclosing
3.在全局作用域中找 – global
4.在内置作用域中找 – builtin
def f():
# x = 2 如果你要申明全局变量,那就不要在前面又定义一个同名的局部变量
global x #申明x为全局变量
x = 5
x = 1
f()
print(x)
# 运行结果
# 5
2.3.2 内置作用域
print(a)
print(__name__)
# __main__
def f():
x = 2
def f2():
# x = 3
print(x)
print(__name__)
f2()
# x=1
#__name__='sc'
f()
# 运行结果
#2
#__main__
2.3 文档注释
文档注释
文档注释是包、模块、类或者函数第一个用三引号引起来的字符串
def f():
"""
this is test func
f()
:return:
"""
print("hello")
print(help(f))
f()
this is test func
f()
:return:
None