Python 參數傳遞

python中的變量:python

一個變量是局部仍是全局,在編譯函數的時候就已經決定,所以讀變量值的時候也不會逐層向外查找。變量是全局仍是局域,根據以下3條:函數

  1. 若是函數內部有global語句,那麼它聲明的變量是全局的。

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

  3. 除此以外都是全局的。

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

  1. def f():
  2.     print x
  3.     if 0:
  4.         x = 1

上面的程序中存在x=1,所以x爲局域變量。(運行報錯)code

  x = 0blog

  def  f():
    print x
內存

上面的程序不報錯,x爲全局變量,符合第三條  編譯


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

  1. def f3():
  2.     exec("")
  3.     a = 1
  4.     global b
  5.     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的字典中,字典表示爲{'x':1}或{'x':1,'y':2}

上面*號都是出如今函數的定義中

其實*號一樣能夠出如今函數的調用中,實際效果與在定義中使用恰好相反,下面給出實例代碼:

  1. 1 #!/usr/bin/env python  
    2 def F(a,b):  
    3     print a,b  
    4   
    5 argv = (1,2)  
    6 #argv = [1,2]  
    7 #argv = {'a':1,'b':2}  
    8 F(*argv)  

調用 F(*argv),將輸出 1,2

將argv 定義成代碼中註釋掉的列表,字典仍然有效,且對於字典F(*argv)與F(**argv) 調用結果相同

由此咱們能夠這樣理解:

函數定義中的 * ,用於將多餘的參數合併爲一個元組 (對於 ** 是合併爲字典)

函數調用中的* ,用於將元組或列表或字典參數,分解爲單個的變量值,並作爲參數傳遞 (ps:暫時只能這樣表述了 )

相關文章
相關標籤/搜索