最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解析Python中的變量、引用、拷貝和作用域的問題

 更新時間:2015年04月07日 11:41:23   投稿:goldensun  
這篇文章主要介紹了Python中的變量、引用、拷貝和作用域的相關問題,是Python學習過程當中必會的基礎知識,需要的朋友可以參考下

在Python中,變量是沒有類型的,這和以往看到的大部分編輯語言都不一樣。在使用變量的時候,不需要提前聲明,只需要給這個變量賦值即可。但是,當用變量的時候,必須要給這個變量賦值;如果只寫一個變量,而沒有賦值,那么Python認為這個變量沒有定義。如下:
 

>>> a
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined

    下面我們具體講一下Python中的變量,引用,拷貝和作用域問題。。

    一、可變對象 & 不可變對象

    在Python中,對象分為兩種:可變對象和不可變對象,不可變對象包括int,float,long,str,tuple等,可變對象包括list,set,dict等。需要注意的是:這里說的不可變指的是值的不可變。對于不可變類型的變量,如果要更改變量,則會創(chuàng)建一個新值,把變量綁定到新值上,而舊值如果沒有被引用就等待垃圾回收。另外,不可變的類型可以計算hash值,作為字典的key??勺冾愋蛿?shù)據(jù)對對象操作的時候,不需要再在其他地方申請內(nèi)存,只需要在此對象后面連續(xù)申請(+/-)即可,也就是它的內(nèi)存地址會保持不變,但區(qū)域會變長或者變短。

    下面是一些例子:
 

>>> a = 'xianglong.me'
>>> id(a)
140443303134352
>>> a = '1saying.com'
>>> id(a)
140443303131776
# 重新賦值之后,變量a的內(nèi)存地址已經(jīng)變了
# 'xianglong.me'是str類型,不可變,所以賦值操作知識重新創(chuàng)建了str '1saying.com'對象,然后將變量a指向了它

 

>>> a_list = [1, 2, 3]
>>> id(a_list)
140443302951680
>>> a_list.append(4)
>>> id(a_list)
140443302951680
# list重新賦值之后,變量a_list的內(nèi)存地址并未改變
# [1, 2, 3]是可變的,append操作只是改變了其value,變量a_list指向沒有變

    二、變量無類型,對象有類型

201547113851606.jpg (668×316)

    三、函數(shù)值傳遞

    先看一個例子:
 

def func_int(a):
  a += 4
 
def func_list(a_list):
  a_list[0] = 4
 
t = 0
func_int(t)
print t
# output: 0
 
t_list = [1, 2, 3]
func_list(t_list)
print t_list
# output: [4, 2, 3]

    對于上面的輸出,不少Python初學者都比較疑惑:第一個例子看起來像是傳值,而第二個例子確實傳引用。其實,解釋這個問題也非常容易,主要是因為可變對象和不可變對象的原因:對于可變對象,對象的操作不會重建對象,而對于不可變對象,每一次操作就重建新的對象。

    在函數(shù)參數(shù)傳遞的時候,Python其實就是把參數(shù)里傳入的變量對應的對象的引用依次賦值給對應的函數(shù)內(nèi)部變量。參照上面的例子來說明更容易理解,func_int中的局部變量"a"其實是全部變量"t"所指向對象的另一個引用,由于整數(shù)對象是不可變的,所以當func_int對變量"a"進行修改的時候,實際上是將局部變量"a"指向到了整數(shù)對象"1"。所以很明顯,func_list修改的是一個可變的對象,局部變量"a"和全局變量"t_list"指向的還是同一個對象。

    四、淺拷貝 & 深拷貝

    接下來的問題是:如果我們一定要復制一個可變對象的副本怎么辦?簡單的賦值已經(jīng)證明是不可行的,所以Python提供了copy模塊,專門用于復制可變對象。copy中有兩個方法:copy()和deepcopy(),前一個是淺拷貝,后一個是深拷貝。淺拷貝僅僅復制了第一個傳給它的對象,下面的不管了;而深拷貝則將所有能復制的對象都復制了。下面是一個例子:
 

a = [[1, 2, 3], [4, 5, 6]]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
 
a.append(15)
a[1][2] = 10
 
print a
print b
print c
print d
 
# [[1, 2, 3], [4, 5, 10], 15]
# [[1, 2, 3], [4, 5, 10], 15]
# [[1, 2, 3], [4, 5, 10]]
# [[1, 2, 3], [4, 5, 6]]

    五、作用域

    在Python程序中創(chuàng)建、改變或查找變量名時,都是在一個保存變量名的地方進行中,那個地方我們稱之為命名空間。作用域這個術語也稱之為命名空間。具體地說,在代碼中變量名被賦值(Python中變量聲明即賦值,global 聲明的只是變量的使用域)的位置決定了該變量能被訪問的范圍。函數(shù)定義了本地作用域,而模塊定義的是全局作用域。

    每一個模塊都是全局作用域。也就是說,創(chuàng)建于模塊文件頂層的變量具有全局作用域,對于外部訪問就成了一個模塊對象的屬性。全局作用域的作用范圍僅限于單個文件?!叭帧敝傅氖窃谝粋€文件的頂層變量名對于這個文件而言是全局的。每次對函數(shù)的調(diào)用都創(chuàng)建了一個新的本地作用域。Python中也有遞歸,即可以調(diào)用自身,每次調(diào)用都會創(chuàng)建五個新的本地命名空間。賦值的變量名除非聲明為全局變量,否則均為本地變量。如果需要在函數(shù)內(nèi)部對模塊文件頂層的變量名賦值,需要在函數(shù)內(nèi)部通過 global 語句聲明該變量。所有的變量可歸納為本地、全局或者內(nèi)置三種。范圍分別為def內(nèi)部,在一個模塊的命名空間內(nèi)部和預定義的 __builtin__ 模塊提供的變量。

    變量名引用分為三個作用域進行查找:首先是本地,然后是函數(shù)內(nèi)(如果有的話),之后是全局,最后是內(nèi)置。在默認情況下,變量名賦值會創(chuàng)建或者改變本地變量。全局聲明將會給映射到模塊文件內(nèi)部的作用域的變量名賦值。Python 的變量名解析機制也稱為 LEGB 法則,具體如下:

    當在函數(shù)中使用未確定的變量名時,Python搜索4個作用域:本地作用域(L),之后是上一層嵌套結構中 def 或 lambda 的本地作用域(E),之后是全局作用域(G),最后是內(nèi)置作用域(B)。按這個查找原則,在第一處找到的地方停止。如果沒有找到,Python 會報錯的。下圖說明了搜索流程(由內(nèi)及外):

    上面說了,Python中的變量是沒有類型的,但Python其實是區(qū)分類型的:Python的所有變量其實都是指向內(nèi)存中的對象的一個指針,都是值的引用,而其類型是跟著對象走的??偨Y來說:在Python中,類型是屬于對象的,而不是變量, 變量和對象是分離的,對象是內(nèi)存中儲存數(shù)據(jù)的實體,變量則是指向對象的指針。在《Learning Python》一書中有一個觀點:變量無類型,對象有類型,大概也是說的這個意思。下面是一張說明變量的圖:
    

201547113948152.png (417×321)

    Python像PHP一樣提供了一個global語法,global定義的本地變量會變成其對應全局變量的一個別名,即是同一個變量。下面的例子可以幫你更好的理解:
 

a = 44
 
def test1():
  a = 14
  print a
test1() # 輸出:14
 
def test2():
  global a
  print a
test2() # 輸出:44

相關文章

  • 詳解Python中for循環(huán)的使用

    詳解Python中for循環(huán)的使用

    這篇文章主要介紹了Python中for循環(huán)的使用,來自于IBM官方網(wǎng)站技術文檔,需要的朋友可以參考下
    2015-04-04
  • 一文教你解決Python不支持中文路徑的問題

    一文教你解決Python不支持中文路徑的問題

    Python是一種廣泛使用的高級編程語言,然而在處理包含中文字符的文件路徑時,Python有時會表現(xiàn)出一些不友好的行為,下面小編就來為大家介紹一下具體的解決方法吧
    2025-03-03
  • PyTorch實現(xiàn)線性回歸詳細過程

    PyTorch實現(xiàn)線性回歸詳細過程

    本文介紹PyTorch實現(xiàn)線性回歸,線性關系是一種非常簡單的變量之間的關系,因變量和自變量在線性關系的情況下,可以使用線性回歸算法對一個或多個因變量和自變量間的線性關系進行建模,該模型的系數(shù)可以用最小二乘法進行求解,需要的朋友可以參考一下
    2022-03-03
  • Python3.6+selenium2.53.6自動化測試_讀取excel文件的方法

    Python3.6+selenium2.53.6自動化測試_讀取excel文件的方法

    這篇文章主要介紹了Python3.6+selenium2.53.6自動化測試_讀取excel文件的方法,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-09-09
  • Python3實現(xiàn)捕獲Ctrl+C終止信號

    Python3實現(xiàn)捕獲Ctrl+C終止信號

    這篇文章主要為大家詳細介紹了如何利用Python3實現(xiàn)捕獲Ctrl+C終止信號的功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-03-03
  • Python學習之加密模塊使用詳解

    Python學習之加密模塊使用詳解

    加密模塊在工作中被廣泛應用。比如數(shù)據(jù)的傳入 不希望被捕獲,通過把數(shù)據(jù)加密,這樣即使被捕獲也無法獲取到數(shù)據(jù)的真實信息。本文將學習一下Python中的加密模塊的使用 方法,需要的可以參考一下
    2022-03-03
  • Python工程實踐之np.loadtxt()讀取數(shù)據(jù)

    Python工程實踐之np.loadtxt()讀取數(shù)據(jù)

    為了方便使用和記憶,有時候我們會把numpy.loadtxt()縮寫成np.loadtxt(),這篇文章主要給大家介紹了關于Python工程實踐之np.loadtxt()讀取數(shù)據(jù)的相關資料,需要的朋友可以參考下
    2023-07-07
  • Python函數(shù)默認返回None的原因及分析

    Python函數(shù)默認返回None的原因及分析

    Python函數(shù)默認返回None是因為在語法層面,解釋器會主動地為沒有return語句的函數(shù)添加一個返回邏輯,返回值為None
    2024-11-11
  • python3爬蟲中引用Queue的實例講解

    python3爬蟲中引用Queue的實例講解

    在本篇內(nèi)容里小編給大家整理的是一篇關于python3爬蟲中引用Queue的實例講解內(nèi)容,有興趣的朋友們可以學習下。
    2020-11-11
  • TensorFlow2.0:張量的合并與分割實例

    TensorFlow2.0:張量的合并與分割實例

    今天小編就為大家分享一篇TensorFlow2.0:張量的合并與分割實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01

最新評論

安陆市| 南木林县| 南华县| 孙吴县| 读书| 射阳县| 陆河县| 新巴尔虎右旗| 壤塘县| 华阴市| 阿尔山市| 浦城县| 榕江县| 南投市| 阜康市| 莱芜市| 邳州市| 临海市| 新巴尔虎左旗| 巴林右旗| 涞源县| 绥宁县| 朝阳市| 安仁县| 宁都县| 丹凤县| 宜黄县| 兴海县| 库尔勒市| 宁阳县| 平南县| 施甸县| 福贡县| 玉门市| 都兰县| 湖南省| 翼城县| 通城县| 碌曲县| 阿瓦提县| 金堂县|