只要一寫程序,再加上不熟悉,多多少少會遇到一些問題。在這篇文章中,我把在Python中遇到的一些問題,進行一個簡單的總結。
pip 與 easy_install
首先,這兩個都是Python的包管理工具。簡單來說pip是easy_install的升級版,可以用pip就用pip吧。
另外,如果python通過源碼setup.py文件進行安裝,如python setup.py install xxx
,那么其安裝所依賴包的下載鏡像源的配置文件為easy_install的配置,所以即便修改了pip的下載鏡像配置文件~/.pip/pip.conf
是沒有效果的,要修改~/.pydistutils.cfg
才能起作用,具體方式在下文說明。
那么能否說明用采用這種方式安裝用的是easy_install呢?還請大佬解答
用法
easy_install的用法:
- 安裝一個包
$ easy_install <package_name>
$ easy_install "<package_name>==<version>"
- 升級一個包
$ easy_install -U "<package_name>>=<version>"
pip的用法
- 安裝一個包
$ pip install <package_name>
$ pip install <package_name>==<version>
- 升級一個包 (如果不提供version號,升級到最新版本)
$ pip install --upgrade <package_name>>=<version>
- 刪除一個包
$ pip uninstall <package_name>
以上可以看出easy_install沒有刪除包的方法。
使用國內源
方法1:命令方式臨時修改
- easy_install:
easy_install -i https://pypi.tuna.tsinghua.edu.cn/simple fabric
- pip:
pip -i https://pypi.tuna.tsinghua.edu.cn/simple install fabric
方法2:配置方式修改
- easy_install:
- 打開pydistutils.cfg
vi ~/.pydistutils.cfg
- 寫入以下內容
[easy_install]
index_url = https://pypi.tuna.tsinghua.edu.cn/simple
- pip:
- 打開pip.conf
vi ~/.pip/pip.conf
- 寫入以下內容
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
速度比較快的國內鏡像
豆瓣:https://pypi.douban.com/simple
清華:https://pypi.tuna.tsinghua.edu.cn/simple
python變量作用域
這個是我覺得比較坑的一個地方,在寫程序的時候一定要仔細看看某個變量是否在之前用過了,因為python的局部變量作用域不是以縮進(對應其他語言的大括號)進行劃分的。
Python變量作用域分為四類
L (Local) 局部作用域
E (Enclosing) 閉包函數外的函數中
G (Global) 全局作用域
B (Built-in) 內建作用域
以L --> E --> G -->B
的規則查找,即:在局部找不到,便會去局部外的局部找(例如閉包),再找不到就會去全局找,再者去內建中找。
Python除了def/class/lambda
外,其他如: if/elif/else/ try/except for/while并不能改變其作用域。定義在他們之內的變量,外部還是可以訪問。這和其他語言,如:Java,按照括號來分作用域,是有很大區別的。
>>> if True:
... a = 'I am A'
...
>>> a
'I am A'
# 定義在if語言中的變量a,外部還是可以訪問的。
# 但是需要注意如果if被 def/class/lambda 包裹,在內部賦值,就變成了此 函數/類/lambda 的局部作用域。
在 def/class/lambda內進行賦值,就變成了其局部的作用域,局部作用域會覆蓋全局作用域,但不會影響全局作用域。
g = 1 #全局的
def fun():
g = 2 #局部的
return g
print fun()
# 結果為2
print g
# 結果為1
但是要注意,有時候想在函數內部引用全局的變量,疏忽了就會出現錯誤,比如:
#file1.py
var = 1
def fun():
print var
var = 200
print fun()
#file2.py
var = 1
def fun():
var = var + 1
return var
print fun()
# 這兩個函數都會報錯UnboundLocalError: local variable 'var' referenced before assignment
在未被賦值之前引用的錯誤!為什么?因為在函數的內部,解釋器探測到var被重新賦值了,所以var成為了局部變量,但是在沒有被賦值之前就想使用var,便會出現這個錯誤。解決的方法是在函數內部添加 globals var
但運行函數后全局的var也會被修改。
淺拷貝與深拷貝
這部分內容可以參考我之前的一篇文章python二維數組重復賦值問題