python做用域

做用域

  1. 從空間角度研究函數python

    全局名稱空間: py文件運行時開闢的,存放的是執行的py文件(除去函數內部)的全部的變量與值(地址)的對應關係,整個py文件結束以後,纔會消失。函數

    臨時(局部)名稱空間: 函數執行時,在內存中臨時開闢的一個空間,存放的函數中的變量與值的對應關係,隨着函數的結束而消失。code

    內置名稱空間:input,print,內置函數等。內存

  2. 取值順序加載順序作用域

    加載順序:上面這三個空間,誰先加載到內存。input

    內置名稱空間 ----》 全局名稱空間 ----》 (函數執行時)臨時名稱空間io

    取值順序:(就近原則)class

  3. 做用域變量

    全局做用域:全局名稱空間,內置名稱空間。文件

    局部做用域:局部名稱空間。

關鍵字:global,nonlocal

# count = 0
#
# def func():
#     count += 1
# func()
#報錯
# UnboundLocalError: local variable 'count' referenced before assignment
# 解釋器認爲:若是你在局部做用域對一個變量進行修改了,
# 你在局部做用域已經定義好這個變量了。

global

  1. 能夠在局部做用域聲明一個全局變量。

    # 這是剪切
    # def func():
    #    在全局定義一個變量name
    #     global name
    #     name = 1
    #
    #     print(globals())
    #     # print(locals())
    #     name += 1
    #     print(globals())
    #
    #
    # func()
    # # print(name)
    # print(globals())
  2. 能夠修改全局變量。

    # count = 0
    #
    # def func():
    #     global count
    #     count += 1
    #
    # print(count)
    # func()
    # print(count)

nonlocal

  1. 不能操做全局變量。
  2. 能夠對父級做用域的變量進行修改,而且在當前做用域建立(複製)一份此變量。
# 這是複製
# def func():
#     count = 0
#     def inner():
#         nonlocal count
#         count += 1
#         print(count)
#         print(locals())
#     inner()
#     print(locals())
# func()
# UnboundLocalError: local variable 'count' referenced before assignment
# 解釋器認爲:若是你在局部做用域對一個變量進行修改了,
# 你在局部做用域已經定義好這個變量了。
相關文章
相關標籤/搜索