*args
、**kwargs
*args
、**kwargs
來將多的引數都放在同一個參數上*args
、**kwargs
的名稱是慣例,非強制,也可以依需求改用其他名稱*args
(位置引數)把多的引數打包成 tuple**kwargs
(關鍵字引數)把多的關鍵字引數打包成 dict*args
必須在 **kwargs
前面**kwargs
傳入時的 key 值不可和函式內原本設定的參數名稱重複,會跳錯誤fun(位置參數, 預設值參數, *args, **kwargs)
def foo(x, y , *z):
total = [x, y, z]
print(total)
foo(1, 2, 3, 4)
# [1, 2, (3, 4, 5)]
def foo(x, y , **z):
total = [x, y, z]
print(total)
foo(1, 2, a=3, b=4, c=5)
# [1, 2, {'a': 3, 'b': 4, 'c': 5}]
def foo(*args, **kwargs):
print(args, kwargs)
foo (1, 2, a=3, b=5)
(1, 2) {'a': 3, 'b': 5}
=
,就代表宣告一個區域變數global
來宣告
global
才賦值 =
a = xxx
,若沒有則會往外尋找,都沒有就會出現錯誤異常+=
,會因為變動前,未明確賦值而出現錯誤local
a = 0
def fun():
a = 1
print("fun:", a)
fun()
print("global:", a)
# fun: 1
# global: 0
# 同名也沒關係,函式內的 a 為區域變數與外部的 a 無關
global
a = 0
def fun():
global a
b = 5
print("a:", a)
a = a + b
print("a:", a)
print("b:", b)
fun()
print("global:", a)
# a: 0
# a: 5
# b: 5
# global: 5
# a 變成 global 因此外部也跟著改變
讀取與賦值
a = 0
def fun():
b = a + 1
print("a:", a)
print("b:", b)
fun()
print("global:", a)
# a: 0
# b: 1
# global: 0
# a 直接讀取來給 b 使用
a = 0
def fun():
print("a:", a)
a = 1
fun()
# 錯誤
# a 有賦值 =,但卻在賦值之前先被讀取
a = [1, 2, 3]
def fun():
a.append(4)
fun()
print(a)
# [1, 2, 3, 4]
# a 為可動物件,影響到外層
a = [1, 2, 3]
def fun():
a += [4]
fun()
# 錯誤
# a 要變動(+),但在變動之前卻未明確賦值(=)
小補充
nonlocal
來宣告a = 0
def fun():
a = 1
def fun2():
nonlocal a
a = 2
print("fun2:", a)
fun2()
print("fun:", a)
fun()
print("global:", a)
fun2: 2
fun: 2
global: 0
感覺這幾天有點燒腦,喘口氣明天繼續