python 引數傳遞 Python 引數傳遞

2021-10-11 17:22:02 字數 1440 閱讀 9862

python中的變數:

乙個變數是區域性還是全域性,在編譯函式的時候就已經決定,因此讀變數值的時候也不會逐層向外查詢。變數是全域性還是局域,根據如下3條:

1. 如果函式內部有global語句,那麼它宣告的變數是全域性的。

2. 如果函式內部有對變數的賦值語句,那麼它是局域的。

3. 除此之外都是全域性的。

注意1和2,和語句的位置無關,只要有這樣的語句,那麼它的範圍就確定了。例如:

def f():

print x

if 0:

x = 1

上面的程式中存在x=1,因此x為局域變數。(執行報錯)

x = 0

def  f():

print x

上面的程式不報錯,x為全域性變數,符合第三條

只有一種特例會逐層向外查詢,函式體內存在exec語句時,例如:

def f3():

exec("")

a = 1

global b

print a,b,c

在這個程式中,根據規則1和2,a是局域,b是全域性。而c符合第3種情況,但存在exec語句,因此它變成了逐層向外查詢,這樣可以應付exec("c=100")這樣的情況,讀取c時,先在locals()中查詢c,找不到的話就在全域性globals()中尋找。

python 支援4種引數傳遞的方式:

1.定義:

f(a,b)

呼叫:f(1,2)

2.定義:

f(a,b=9)

呼叫:f(1) 或 f(1,2)  #第二個引數未給出的話,使用預設的值 9

3.定義:

f(*a)

呼叫:f(1) 或 f(1,2)或f(1,2,3)

#這種方式可以接收任意多個引數儲存到名為a的元組中,在函式內部可通過a元組訪問這些引數

4.定義:

f(**a)

呼叫:f(x=1)或f(x=1,y=2)

## 這種方式同樣可以接收任意多個引數,並將引數儲存到名為a的字典中,字典表示為或

上面*號都是出現在函式的定義中

其實*號同樣可以出現在函式的呼叫中,實際效果與在定義中使用剛好相反,下面給出例項**:

1 #!/usr/bin/env python

2 deff(a,b):3 printa,b4

5 ar** = (1,2)6 #ar** = [1,2]

7 #ar** =

8 f(*ar**)

呼叫 f(*ar**),將輸出 1,2

將ar** 定義成**中注釋掉的列表,字典仍然有效,且對於字典f(*ar**)與f(**ar**) 呼叫結果相同

由此我們可以這樣理解:

函式定義中的 * ,用於將多餘的引數合併為乙個元組 (對於 ** 是合併為字典)

函式呼叫中的* ,用於將元組或列表或字典引數,分解為單個的變數值,並做為引數傳遞 (ps:暫時只能這樣表述了 )

python 引數傳遞 python引數傳遞

python中函式引數的傳遞是通過 賦值 來傳遞的。但這條規則只回答了函式引數傳遞的 戰略問題 並沒有回答 戰術問題 也就說沒有回答怎麼賦值的問題。函式引數的使用可以分為兩個方面,一是函式引數如何定義,二是函式在呼叫時的引數如何解析的。而後者又是由前者決定的。函式引數的定義有四種形式 1.f arg...

python變數傳遞 Python引數傳遞

在 python 中,型別屬於物件,變數是沒有型別的 a 1,2,3 a runoob 以上 中,1,2,3 是 list 型別,runoob 是 string 型別,而變數 a 是沒有型別,她僅僅是乙個物件的引用 乙個指標 可以是指向 list 型別物件,也可以是指向 string 型別物件。可更...

Python 引數傳遞

python的引數傳遞很有趣的樣子,記一下。位置引數,通過位置對應傳遞引數 def try name,age first,second name,age print first s,second d first,second try sam 3 first sam,second 3 位置引數,若有預...