對于Python中的引數,可以有如下三種:位置和關鍵字引數、任意數量的位置引數、任意數量的關鍵字引數,
我們知道對于Python中的名字的決議被稱為LGB規則,有以下三點
1.當在函式中使用一個無限制的名字時,Python依次查找三個作用域:區域(Local)、全域(Global)、內置(Built-in),在第一個發現名字的位置停止,
2.在函式中賦值一個名字時,Python總在區域作用域中生成或者改變它,除非在函式中對它進行了global的宣告,
3.在函式外部時,區域作用域與全域作用域等效,都是同一個模塊的名字空間,
這里主要討論一下在自定義函式中應用引數傳遞的實作,代碼如下:
x=1
list=[1,2]
def func(x,y):
x=2
y[0]='A'
func(x,list)
print('呼叫函式后傳入的引數變化為:',x,list))
呼叫函式后傳入的引數變化為: 1 ['A', 2]
Process finished with exit code 0
func()對x和被y參考的物件中的組件賦值,x是函式作用域中的區域名字,第1個賦值對呼叫者沒有影響,引數y也是個區域的名字,但傳遞了y[0],這是一個可變的物件,最后就把list中的第一個位置換掉了!
那我們思考一下,我還想換掉x=1,既利用模塊中的x=2,該如何操作,
如果是如下代碼塊,就會報錯:
x=1
list=[1,2]
def func(x):
global x
x=2
func()
print('呼叫函式后傳入的引數變化為:',x)
global x
SyntaxError: name 'x' is parameter and global
Process finished with exit code 1
我們看到了報錯,語法錯誤:x既是引數又是全域變數,這樣是不對的,x是不能既做變數又做引數的,
那么我們換一種方式,看看是否可以,代碼如下:
x=1
list=[1,2]
def func():
global x
x=2
y[0]='A'
func(x,list)
print('呼叫函式后傳入的引數變化為:',x)
func(x,list)
TypeError: func() takes 0 positional arguments but 2 were given
Process finished with exit code 1
好的,又出錯了,對型別的無效操作:func()可以接收的位置引數是0個,但卻接收到了2個引數(x,list),這樣也是不對的,因為我們在def func()時候,func()中并沒有位置引數,而我們在呼叫func()時,卻代入了x,list兩個引數,就會報錯,
綜上所述:fun(x)里有引數x時,后面模塊內就不可以跟global x(全域變數),但是func()里無引數x時,后面可以跟global x,把x定義成全域變數,但是呢又有個問題,就是后面呼叫函式func()時,不能寫成func(x),否則又會報錯TypeError,是由于前面是func(),故可接受引數為0
那么該如何操作,到達我們想一樣換掉x=1,使得x=2呢?這里我運用了兩個def func,代碼如下:
x=1
list=[1,2]
def func1():
global x
x=2
func1()
def func2(y):
y[0]='A'
func2(list)
print('呼叫函式引數的結果:',x,list)
呼叫函式引數的結果: 2 ['A', 2]
Process finished with exit code 0
這里,我們成功的把x=1換成了x=2,但是卻用了兩個函式,比較繁重,感徑訓會有更好的程式,由于這也是我開始學習Python時摸索函式引數程序的一點點感悟吧,希望有Python大佬看到可以給與指導和幫助,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/11658.html
標籤:其他
