# 局部變量
當你在函數定義內聲明變量的時候,它們與函數外具有相同名稱的其他變量沒有任何關系,即變量名稱對于函數來說是 局部 的。這稱為變量的 作用域 。所有變量的作用域是它們被定義的塊,從它們的名稱被定義的那點開始。
```
#!/usr/bin/python
# Filename: func_local.py
def func(x):
????print 'x is', x
????x = 2
????print 'Changed local x to', x
x = 50
func(x)
print 'x is still', x
```
(源文件:[code/func_local.py](code/func_local.py))
## 輸出
```
$ python func_local.py
x is 50
Changed local x to 2
x is still 50
```
## 它如何工作
在函數中,我們第一次使用`x`的 值 的時候,Python使用函數聲明的形參的值。
接下來,我們把值`2`賦給`x`。`x`是函數的局部變量。所以,當我們在函數內改變`x`的值的時候,在主塊中定義的`x`不受影響。
在最后一個`print`語句中,我們證明了主塊中的`x`的值確實沒有受到影響。
如果你想要為一個定義在函數外的變量賦值,那么你就得告訴Python這個變量名不是局部的,而是 全局 的。我們使用`global`語句完成這一功能。沒有`global`語句,是不可能為定義在函數外的變量賦值的。
你可以使用定義在函數外的變量的值(假設在函數內沒有同名的變量)。然而,我并不鼓勵你這樣做,并且你應該盡量避免這樣做,因為這使得程序的讀者會不清楚這個變量是在哪里定義的。使用`global`語句可以清楚地表明變量是在外面的塊定義的。
```
#!/usr/bin/python
# Filename: func_global.py
def func():
????global x
????print 'x is', x
????x = 2
????print 'Changed local x to', x
x = 50
func()
print 'Value of x is', x
```
(源文件:[code/func_global.py](code/func_global.py))
## 輸出
```
$ python func_global.py
x is 50
Changed global x to 2
Value of x is 2
```
## 它如何工作
`global`語句被用來聲明`x`是全局的——因此,當我們在函數內把值賦給`x`的時候,這個變化也反映在我們在主塊中使用`x`的值的時候。
你可以使用同一個`global`語句指定多個全局變量。例如`global x, y, z`。
- 版權信息
- 前言
- 本書的由來
- 本書目前的狀況
- 約定條款
- 反饋
- 值得思考的一些東西
- 第1章 介紹
- Python的特色
- 為什么不使用Perl?
- 程序員的話
- 第2章 安裝Python
- Windows?用戶
- 概括
- 第3章 最初的步驟
- 使用帶提示符的解釋器
- 挑選一個編輯器
- 使用源文件
- 可執行的Python程序
- 獲取幫助
- 概括
- 第4章 基本概念
- 數
- 字符串
- 變量
- 標識符的命名
- 數據類型
- 對象
- 邏輯行與物理行
- 縮進
- 概括
- 第5章 運算符與表達式
- 運算符
- 運算符優先級
- 表達式
- 概括
- 第6章 控制流
- if語句
- while語句
- for循環
- break語句
- continue語句
- 概括
- 第7章 函數
- 函數形參
- 局部變量
- 默認參數值
- 關鍵參數
- return語句
- DocStrings
- 概括
- 第8章 模塊
- 字節編譯的.pyc文件
- from..import語句
- 模塊的name
- 制造你自己的模塊
- dir()函數
- 概括
- 第9章 數據結構
- 列表
- 元組
- 字典
- 序列
- 參考
- 更多字符串的內容
- 概括
- 第10章 解決問題——編寫一個Python腳本
- 解決方案
- 軟件開發過程
- 概括
- 第11章 面向對象的編程
- self
- 類
- 對象的方法
- __init__方法
- 類與對象的方法
- 繼承
- 概括
- 第12章 輸入/輸出
- 儲存器
- 概括
- 第13章 異常
- try..except
- 引發異常
- try..finally
- 概括
- 第14章 Python標準庫
- sys模塊
- os模塊
- 概括
- 第15章 更多Python的內容
- 單語句塊
- 列表綜合
- 在函數中接收元組和列表
- lambda形式
- exec和eval語句
- assert語句
- repr函數
- 概括
- 第16章 接下來學習什么?
- 探索更多內容
- 概括
- 附錄A 自由/開放源碼軟件(FLOSS)
- 附錄B 關于本書
- 關于作者
- 關于譯者
- 關于簡體中文譯本
- 附錄C 修訂記錄
- 術語表