#-*- coding = utf-8 -*-
#@time:2020/8/3 12:52
#@author:huxuehao
#@file:024_作用域_和_命名空間.py
#@software:pycharm
# 一、作用域:變數生效的區域
# 1.分為全域性作用域、函式作用域(區域性作用域)
# 2.全域性作用域:
# - 全域性作用域在執行時建立,在程式執行後銷毀
# - 所有函式以外的區域都是全域性作用域
# - 在全域性作用域中定義的變數都屬於全域性變數
# 3.函式作用域:
# - 在函式呼叫時建立,函式執行後銷毀
# - 函式每呼叫一次就會產生乙個新的函式作用域
# - 函式作用域中的變數就是區域性變數
# - 區域性變數優先使用同級作用域的,同級中沒有的話去上一級中去找
a=10
# 全域性變數
defju()
: a=
20# 區域性變數
return a # 區域性變數優先使用同級作用域的
print
(ju())
# 20
defju()
:return a # 同級中沒有的話去上一級中去找
print
(ju())
# 10
# 4.如果希望在函式中使用同名全域性變數,可以使用global關鍵字宣告
defju()
:global a # 呼叫全域性變數
a =15# 修改全域性變數
print
("函式中呼叫的global a = "
,a)ju(
)print
("全域性變數a = "
,a)# 20
# 二、命名空間(namespace)
# 1. 命名空間是指變數儲存的位置
# 2. 每個作用域都有其物件的命名空間
# 3. 全域性命名空間用於儲存全域性變數,函式命名空間用於儲存區域性變數
# 4. 命名空間實際上就是乙個字典(dict)
# 5. 我們可以通過locals() 函式來獲取相應的命名空間
scope=
locals()
# 獲取全域性命名空間
# print("全域性命名空間:",scope)
a="hello,world"
print
(a)#通過變數名列印變數
print
(scope[
'a']
)#通過命名空間列印變數
scope[
'b']
='這是我通過命名空間新增的變數 b '
# 通過命名空間新增變數(不建議)
print
(b)# 雖然我上面沒有定義b 但是依然能列印出b,即使語法上有報錯
defju_space()
: a=
1 b=
2 c=
3 scope=
locals()
print
("函式的命名空間:"
,scope)
ju_space(
)# 6. 在函式中我們可以通過globals() 獲取到全域性命名空間
defquan_space()
: quju=
globals()
print
("函式內部通過globals()函式獲取到了全域性命名空間:"
,quju)
quan_space(
)
作用域和作用域鏈
全域性作用域 全域性的變數執行環境 函式作用域 函式內部的變數執行環境 每個函式都有自己的執行環境,當執行流進入乙個函式時,函式的環境就會被推入乙個環境棧中。函式執行之後,棧將環境彈出,把控制權返回給之前的執行環境。全域性作用域只要頁面不解除安裝,就一直存在,不釋放。函式每次在呼叫時,都會形成乙個作...
作用域和作用域鏈
var a 10 function f1 x,y f1 console.log b 此時b輸出5,因為b 5為隱式的全域性變數 在函式外面使用var 宣告的變數都是全域性變數,作用範圍是程式執行的地方.全域性作用域 函式除外 函式的形參是區域性變數 在函式內部,不使用var 定義的變數,叫隱式全域性...
作用域和作用域鏈
執行環境定義了變數和函式有權訪問的其他資料,決定了他們各自的行為。每個執行環境都有與之對應的變數物件 variable object 儲存著該環境中定義的所有變數和函式。我們無法通過 來訪問變數物件,但是解析器在處理資料時會在後台使用到它。執行環境有全域性執行環境 也稱全域性環境 和函式執行環境之分...