1. 程式人生 > >python之全局變量與局部變量

python之全局變量與局部變量

類型 如果 name def 消失 小寫 恢復 app python

全局變量:

  - 在書寫中頂格開始;
  - 一旦定義完畢在整個文件生效;
  - 在函數內如果定義了同名全局變量名,會“覆蓋”掉全局變量;
  - 在函數中同名的變量,當在函數退出後消失,全局的同名變量恢復;
  - 如果在函數中想修改外部的全局變量加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

python之全局變量與局部變量