# 全域性變數在區域性重新賦值會報錯,無論是可變資料型別還是不可變資料型別
user = {}
def outer():
if user:
print(user)
user=
# 報錯資訊:unboundlocalerror: local variable 'user' referenced before assignment (區域性變數沒有被定義)
#原因:
變數user在函式內部重新定義了,系統不知道user到底是全域性變數還是區域性變數,如果沒有user=,那麼最後python會解析user為全域性變數
#這種情況不會報錯
user = {}
def outer():
if user:
print(user)
user=
#如果只是修改可變型別的資料,則直接修改的是全域性變數的值,user這個變數從始至終都是全域性變數的這個user
user={}
def outer():
if user:
print(user)
user[1]=2
#總結:
變數的賦值就會在記憶體中的棧區和堆區開闢空間存資料,而命名空間是堆區中的一塊空間儲存變數名和棧區的變數名位址的對應關係,每次賦值命名空間重新產生變數名和變數名的位址的新的對應關係。
函式外的user變數一開始被定義為全域性變數,存在全域性命名空間中;
如果函式內部沒有定義user這個變數,呼叫user就是呼叫全域性的這個user變數
但是如果函式內部已經定義了區域性變數,那就會呼叫函式內部的這個變數,這個程式會報錯,因為呼叫變數user在定義變數之前,在呼叫的時候根本沒有這個變數,所以才會有報錯
user=
def logout():
if not user:
print('user為空')
return
global user
res = user['usr']
user = {}
#報錯資訊:syntaxerror: name 'user' is used prior to global declaration
#原因:函式體內呼叫user這個變數,由於函式體內並沒有user這個變數,根據legb原則,呼叫全域性變數user,在第一次呼叫後,再次宣告為全域性變數,則就相當於變數未定義先引用,這個時候python無法識別之前引用的user變數是什麼型別,所以會報錯
#解決方案,在呼叫變數之前宣告變數型別
user=
def logout():
global user
if not user:
print('user為空')
return
res = user['usr']
user = {}
# 變數的查詢順序是legb,區域性變數-內嵌外層區域性變數—全域性變數-內建變數
#因為python 3的儲存結構是堆疊的儲存結構,先定義的在命名空間中的對應關係會排在前面,會先被遍歷
# 案例1: 結果為2,因為python直譯器讀到了inner()這個函式內的變數
a=3def outer():
a=1def inner():
a=2print(a)
inner()
outer()
#案例2:結果是1,因為inner()這個函式體內部並沒有找到a,在它外層的巢狀函式outer()函式體外面找到了a這個變數,所以引用這個變數a的值
a=3def outer():
a=1def inner():
print(a)
inner()
outer()
#案例3: 結果是3,因為inner()這個函式內部以及外部函式outer()都沒有找到a這個變數,所以只能找到函式外部的區域性變數a,所以引用了區域性變數a的值
a=3def outer():
def inner():
print(a)
inner()
outer()
知識點總結
1,迴圈中的中斷 continue 跳出此次迴圈,繼續for迴圈 break 跳出當前for迴圈 return 跳出當前方法 2,字串的操作 componentseparatedbystring stringbyreplacingoccurencesofstring withstring iskin...
知識點總結
oncreate onstrat onresume onpause onstop onrestart ondestroy standard 啟動activity都會產生乙個新的activity 預設模式 singletop 啟動activity允許多個,但不允許重疊 singletask 只允許有乙...
知識點總結
function go go 呼叫 go為變數名 setinterval go,1000 1000ms clearinterval 關閉定時器 function abc a,b 2,3 5undefined 未定義 null 空 nan 非數值 string 字串 var a 123 數字型別 va...