2020/8/27
函数调用的底层
调用方法的时候 其实就是调用已经创造好的对象。调用的时候不会新键对象
在堆里面建立一个对象,在栈里面也保存了一个变量,这个值就是对象的地址
()就是调用
def test():
print("sxtsxt")
test01()
c = test01
#c 把test01的值一样 ,调用c 的时候就找到对应的对象
变量的作用域
变量起作用的范围称作变量的作用域;不同的作用域内 同名变量之间不影响。变量分为全局变量,局部变量。
全局变量:(globals())
- 在函数和类定义之外声明的变量,作为域为定义的模块,从定义位置开始直到模块结束
- 全局变量降低了函数的通用性 和可读性。尽量避免使用全局变量
- 全局变量一般用于常量
- 函数内要改变全局变量的值 用global声明
局部变量(locals()) - 在函数体内声明的变量
- 局部变量比全局变量引用快,所以说优先考虑局部变量
- 如果局部变量和全局变量同名,则在函数内隐藏全局变量,只用局部变量。如果要使用 需要global声明一下
在调用局部变量的时候 会有一个栈帧(stack frame),栈帧可以访问外面,但是不能外面访问里面。并且栈帧被调用结束后 就会被删除。
能使用局部变量就尽量使用局部变量
参数的传递
python 中的参数的传递都是“引用传递”,而不是值传递
- 对于可变对象,就进行写操作, 直接作用于对象本身(字典,列表,集合,自定义对象等)
- 对于不可变对象,进行写操作,会产生一个新的对象空间,并用新的值填入这块空间(数字,字符串,元组,function等)
a = [10, 20]
def text0(t):
print(id(t))
t.append(300)`
print(id(t))
text0(a)
print(a)