python-部变量和全局变量

  • 程序变量类型:局部变量和全局变量,全局变量作用于整个程序,一般没有缩进,而局部变量是函数内部定义的一个变量,在函数运行结束后,内部的变量就会被销毁
  • 函数内部可以引用全局变量
n=10    #全局变量
def func ():   
    print(n)
func()
>>>10
  • 来看看函数另一种引用全局变量的例子
n=10   #全局变量
def func (): 
    n=n+2    #局部变量
    print(n)
func()

发生异常:
UnboundLocalError local variable ‘n’ referenced before assignment 意思是局部变量n在使用前没有定义
原因
函数内的n与全局变量同名,并且将其写在了赋值语句的左边,也就是等号的左边,这时的n就会是一个局部变量,在定义之前就调用,当然会出现没有定义的异常错误了
修正:可以使用关键字global

n=10
def func ():
    global n  
    n=n+2    
    print(n)
func()
>>>12
  • 函数内部组合数据类型的引用
ls = [1,2,3]
def func ():
    ls.append(4)
    print(ls)
func()
>>>[1,2,3,4]

咦?为什么这里在函数内部没有定义列表(定义列表需要有[],才算算定义了一个列表)就可以调用呢?
原因:在执行*ls.append(4)*的之前需要创建一个ls的列表,但是在函数的作用域中没有以ls命名的列表,此时的func函数会到全局内存空间去寻找是否存在ls的变量,找到后会自动关联,并修改其内容。
底层原因:组合数据类型使用的是指针,指针是保存内存地址的变量,在函数内部使用指针来修改数据,这个数据就会被改变

  • 那如果在函数内部就创建一个组合数据类型呢
ls = [1,2,3]    #全局变量
def func ():
    ls=[]   #局部变量
    ls.append(4)
    print(ls)
func()
print(ls)
>>>[4]
>>>[1, 2, 3]

在函数内部创建了列表ls,就是一个局部变量,在调用完函数语句之后就会销毁变量,所以最后输出的ls是全局变量

  • 总结
    1.简短数据类型变量是否和全局变量名相同,都在函数内部使用,在函数执行完后就会被销毁
    2.简单数据类型使用global关键字之后就全局变量使用,函数执行完之后,该变量保留
    3.组合数据类型的全局变量,如果在函数内部没有被真实创建同名变量,函数内部也可直接使用,并修改全局变量的值
    4.在函数内部创建了与全局变量同名的组合数据类型,函数仅对局部变量进行操作,函数执行完毕后该数据内存就会被销毁。

你可能感兴趣的:(python)