刘先森含笑半步癫

导航

 

全局变量:

  -   在书写中顶格开始;
  -   一旦定义完毕在整个文件生效;
  -   在函数内如果定义了同名全局变量名,会“覆盖”掉全局变量;
  -   在函数中同名的变量,当在函数退出后消失,全局的同名变量恢复;
  -   如果在函数中想修改外部的全局变量加global关键字;

局部变量   

  -   在函数、过程中定义的变量
  -   只在函数、过程中有效;

#在函数中修改外部的全局变量

name="abc"

def test1():
    global name
    print("修改前:",name)
    name="ZZZ"
    print("修改后:",name)
    
test()

可变&不可变的全局变量:

  -   函数中直接引用外部不可变的全局变量时,是只读的;
  -   如果引用的外部全局变量是可变类型(列表、字典),则可以对内部元素进行操作;
  -   如果想修改不可变类型的,就要加global关键字;
  -   如果在函数中定义了同名的局部变量同时又global关键字引用了外部的全局变量,则报错
  -    (个人意见)不要同时引用,变量名那么多,为什么硬要把自己搞的那么复杂,代码可读性那么差

注意,变量名定义规范:
  - 全局变量名一律大写;
  - 局部变量名一律小写;

#引用外部全局变量

name="abc"

def test1():
    print("name是:",name)
    
test1()

#操作外部可变类型的变量

name=["abc","ZZZ"]
def test1():
    name.append("CCC")   #当全局变量是可变类型时,无需加global关键字,要谨慎这种操作
    print(name)
    
test1()
返回结果:
['abc', 'ZZZ', 'CCC']

#修改外部可变类型的全局变量

name=["abc","ZZZ"]
def test1():
    name.append("CCC")
    name[0]="KKK"
    print(name)

test1()
返回结果:
['KKK', 'ZZZ', 'CCC']

#内部定义之后同时引用外部全局变量,会报错

name=["abc","ZZZ"]
def test1():
    name=[1,2,3]
    global name
    print(name)

test1()
返回结果:
SyntaxWarning: name 'name' is assigned to before global declaration
  global name
[1, 2, 3]

函数嵌套中引用外部全局变量,同时定义同名内部变量,要注意这期间的变化;
下面的global引用的是最外层的全局变量,而非上层函数内的变量
例如:

name="python"

def test1():
    name="Java"
    def test2():
        global name
        name="C++"
    test2()
    print(name)        #注意这里的name仍旧是test1函数里的name
    
print(name)
test1()
print(name)
返回结果:
python
Java
C++

nonlocal关键字:
  -   指定上一级变量;
  -   非引用全局变量;
例如:

name="python"

def test1():
    name="Java"
    def test2():
        nonlocal name  #引用上一级函数内的name
        name="C++"     #修改上一级函数中的name
    test2()
    print(name)
    
print(name)
test1()
print(name)
返回结果:
python
C++
python

 

posted on 2019-02-17 12:23  刘先森含笑半步癫  阅读(459)  评论(0编辑  收藏  举报