局部变量:
在函数内部声明的变量,只能在该函数范围内使用
举例:
def test(): a=10#局部变量 print(a) test() print(a)#函数体外使用局部变量a
在多个函数里面,可以声明同名的局部变量,彼此之间不受影响。
局部变量的作用:给我们临时保存数据
全局变量:
在函数外部声明的变量,在所有函数中都可以使用,但必须在所有函数的上方进行声明。
举例:
a=100#a为全局变量 def test(): print(a) test() def test1(): b=9 print(a+b) test1()
100 100
当全局变量和局部变量同名时,首先编译器会先在局部找,再到全局找,如果两者都没找到,则会报错。
举例:
a=100 def test(): print(a) test() def test1(): a=9 print(a) test1() print(a)
100#局部没有该变量,则在全局范围内进行查找 9#含有和全局变量相同的局部变量,输出局部变量 100
那么局部变量和全局变量到底有什么区别?
本质区别:变量的作用域不同。
在函数内部声明的变量—>局部变量:只能作用于当前这个函数
在函数外部声明的变量—>全局变量:可以在所有函数里面使用
在函数内部修改全局变量的值:
使用global关键字进行声明,告诉python,global后面的变量将是全局变量,再使用赋值语句时,就不会创建局部变量。
举例:
x = 11 def test(): global x#在函数内部修改了全局变量x的值 x = 66 print(x) def test1(): print(x) test() test1()
66 66
函数使用外层的变量:
使用nonlocal进行声明,注意,该变量既不是全局变量也不是局部变量,而是外部嵌套函数内的变量。
举例:
def test(): num = 2 def test1(): nonlocal num#使用test1函数外的变量 num *= 2 print(num) test1() test()
4
可变类型的全局变量:
字典,列表,集合(变量值改变,地址不变)
以列表举例:
li = [] print(id(li)) def test(): global li li.append(88) print(li) test() print(li) print(id(li))
1938324195904#变量的地址并没有发生变化 [88] [88] 1938324195904
以字典举例:
dict ={} print(id(dict)) def test(): global dict dict["name"]="dog" print(dict) test() print(dict) print(id(dict))
2292008286848 {'name': 'dog'} {'name': 'dog'} 2292008286848
以集合举例:
set1 =set() print(id(set1)) def test(): global set1 set1.add(1) print(set1) test() print(set1) print(id(set1))
2000811991552 {1} {1} 2000811991552
不可变类型的全局变量:
数字,元组,字符串(变量值改变,地址会改变)
以数字类型举例:
a = 0 print(id(a)) def test(): global a a = 4 print(a) test() print(a) print(id(a))
140731653887616 4 4 140731653887744
以元组类型举例:
tuple1=() tuple2=(1,2,3) print(id(tuple1)) def test(): global tuple1 tuple1+=tuple2#(元组不可以直接添加元素,但我们可以用拼接的方式) print(tuple1) test() print(tuple1) print(id(tuple1))
2992034349120 (1, 2, 3) (1, 2, 3) 2992040085056
以字符串为例:
string1="hello " string2="python" print(id(string1)) def test(): global string1 string1+=string2#(字符串不可以直接添加元素,但我们可以用拼接的方式) print(string1) test() print(string1) print(id(string1))
3091362679152 hello python hello python 3091367364016