python中的變量:python
一個變量是局部仍是全局,在編譯函數的時候就已經決定,所以讀變量值的時候也不會逐層向外查找。變量是全局仍是局域,根據以下3條:函數
1. 若是函數內部有global語句,那麼它聲明的變量是全局的。
2. 若是函數內部有對變量的賦值語句,那麼它是局域的。
3. 除此以外都是全局的。
注意1和2,和語句的位置無關,只要有這樣的語句,那麼它的範圍就肯定了。例如:spa
上面的程序中存在x=1,所以x爲局域變量。(運行報錯)code
x = 0blog
def f():
print x內存
上面的程序不報錯,x爲全局變量,符合第三條 編譯
只有一種特例會逐層向外查找,函數體內存在exec語句時,例如:class
在這個程序中,根據規則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 #!/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:暫時只能這樣表述了 )