函数作用域
函数作用域标志了变量的生命周期
本地&全局
python
a = 1
def add(y,z):
print y+z+a
return y+z+a
-
全局变量名:a add
- 因为这个a是在这个文件内最外层注册的变量名,所以他是全局变量
- 全局变量能够在函数内部直接使用,而不需要特定的声明
- 全局变量的生命周期:在整个程序运行期间。
-
本地变量名:y,z
- y和z的注册地址在函数内部,y和z是局部变量
- 局部变量生命周期:函数运行期间
python
>>> a = 1
>>> def change():
... a = 2
... print(a)
...
>>> a
1
>>> change() #打印函数内部修改之后的a
2
>>> a #打印外部a
1
- 外部的a并没有被修改
- 这是因为,函数内部赋值 的变量除非声明为全局变量或非本地变量,否则均为本地变量
- 这里的a = 2,因为是在函数内部使用赋值的,所以解释器会把它当作一个函数内部的变量,他的作用域是这个函数内部
- 如果想修改 一个全局变量,只需要在函数内部被修改变量前加global语句
python
>>> a = 1
>>> def change():
... global a
... a = 2
... print(a)
...
>>> a
1
>>> change() #打印函数内部修改之后结果
2
>>> a #打印外部的a值
2
传值&传引用
- 可变对象作为参数传递,可以在函数内部直接修改初始数据对象的值,是传引用
- 不可变对象传递时,无法直接修改初始数据对象的值,是传值
传递一个不可变对象,按值传递:
python
>>> a = 1
>>> def change(a):
... a = 2
... print(a)
...
>>> change(a)
2
>>> a
1
传递一个可变对象,按引用传递:
python
>>> a = [1,2,3]
>>> def change(a):
... a[0] = 'a'
... print(a)
...
>>> a
[1, 2, 3]
>>> change(a)
['a', 2, 3]
>>> a
['a', 2, 3]
#可变对象作为参数传递,传的是引用,内部修改影响全局