Python中遇到的坑

只要一寫程序,再加上不熟悉,多多少少會遇到一些問題。在這篇文章中,我把在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的用法:

  1. 安裝一個包
$ easy_install <package_name>
$ easy_install "<package_name>==<version>"
  1. 升級一個包
$ easy_install -U "<package_name>>=<version>"

pip的用法

  1. 安裝一個包
$ pip install <package_name>
$ pip install <package_name>==<version>
  1. 升級一個包 (如果不提供version號,升級到最新版本)
$ pip install --upgrade <package_name>>=<version>
  1. 刪除一個包
$ 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:
  1. 打開pydistutils.cfg
vi ~/.pydistutils.cfg
  1. 寫入以下內容
[easy_install]
index_url = https://pypi.tuna.tsinghua.edu.cn/simple
  • pip:
  1. 打開pip.conf
vi ~/.pip/pip.conf
  1. 寫入以下內容
[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二維數組重復賦值問題

參考資料

  1. easy_install與pip 區別
  2. pip 更換軟件鏡像源
  3. 清華pypi 鏡像使用幫助
  4. Python 變量作用域
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容