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

深入淺析Python傳值與傳址

 更新時(shí)間:2018年07月10日 14:34:54   作者:Salane  
這篇文章主要介紹了Python傳值與傳址的相關(guān)知識(shí),包括傳值與傳址的區(qū)別介紹,需要的朋友可以參考下

1. 傳值與傳址的區(qū)別

傳值就是傳入一個(gè)參數(shù)的值,傳址就是傳入一個(gè)參數(shù)的地址,也就是內(nèi)存的地址(相當(dāng)于指針)。他們的區(qū)別是如果函數(shù)里面對(duì)傳入的參數(shù)重新賦值,函數(shù)外的全局變量是否相應(yīng)改變:用傳值傳入的參數(shù)是不會(huì)改變的,用傳址傳入就會(huì)。

def a(n):
  n[2] = 100
  print(n)
  return None
def b(n):
  n += 100
  print(n)
  return None
an = [1,2,3,4,5]
bn = 10
print(an)
a(an)
print(an)
print(bn)
b(bn)
print(bn)
[1, 2, 3, 4, 5]
[1, 2, 100, 4, 5]
[1, 2, 100, 4, 5]
10
110
10

在上面的例子中,an是一個(gè)list,將其作為實(shí)參傳入函數(shù)a中,a對(duì)其第三個(gè)元素進(jìn)行修改。a執(zhí)行結(jié)束后再次打印an,發(fā)現(xiàn)里面的元素的確發(fā)生變化,這就是傳址操作。bn代表一個(gè)數(shù)字,將其傳入函數(shù)b,并做修改,b執(zhí)行結(jié)束后再次打印bn,沒有變化,這是傳值操作。

2. Python中傳值與傳址的規(guī)律

Python是不允許程序員選擇采用傳值還是傳址的。Python參數(shù)傳遞采用的是“傳對(duì)象引用”的方式,實(shí)際上,這種方式相當(dāng)于傳值和傳址的一種綜合。

如果函數(shù)收到的是一個(gè)可變對(duì)象(比如字典或者列表)的引用,就能修改對(duì)象的原始值——相當(dāng)于傳址。如果函數(shù)收到的是一個(gè)不可變對(duì)象(比如數(shù)字、字符或者元組)的引用,就不能直接修改原始對(duì)象——相當(dāng)于傳值。所以python的傳值和傳址是根據(jù)傳入?yún)?shù)的類型來(lái)選擇的。

傳值的參數(shù)類型:數(shù)字,字符串,元組

傳址的參數(shù)類型:列表,字典

3. 內(nèi)置函數(shù)id

內(nèi)置函數(shù)id,負(fù)責(zé)顯示一個(gè)變量或者數(shù)據(jù)在內(nèi)存中的地址,有時(shí)可以用來(lái)檢測(cè)所使用的對(duì)象是否為同一個(gè),幫助區(qū)別傳值與傳址操作。

但是id在有些情況下比較特殊,注意下面的例子。

a = 100
b = 200 
print(id(a))
print(id(b))
c = a
print(id(c))
print(a is c)
a += 300
print(a)
print(c)
print(a is c)
print(id(a))
print(id(c))
1549495552
1549498752
1549495552
True
400
100
False
93638128
1549495552

為了提高內(nèi)存利用效率,對(duì)于一些簡(jiǎn)單的對(duì)象,如一些數(shù)值較小的int對(duì)象,python采取重用對(duì)象內(nèi)存的辦法。如指向a=100,c=100時(shí),由于100作為簡(jiǎn)單的int類型且數(shù)值小,python不會(huì)兩次為其分配內(nèi)存,而是只分配一次,然后將a與c同時(shí)指向已分配的對(duì)象。但是當(dāng)a的值發(fā)生變化時(shí),會(huì)單獨(dú)為a重新分配一個(gè)新的內(nèi)存。

4. list傳值與傳址

list類型使用簡(jiǎn)單的賦值操作,是傳址。

a = [1,2,3,4,5]
b = a
print(a)
b[2] = 333
print(a)
print(b)
print(id(a))
print(id(b))
[1, 2, 3, 4, 5]
[1, 2, 333, 4, 5]
[1, 2, 333, 4, 5]
96142472
96142472

copy函數(shù)是淺拷貝,是傳值。python2中,需要import copy模塊,python3可直接使用。

a = [1,2,3,4,5]
b = a.copy()
print(a)
b[2] = 333
print(a)
print(b)
print(id(a))
print(id(b))
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
[1, 2, 333, 4, 5]
92990536
96202632

由于copy是淺拷貝,只拷貝一層的內(nèi)容,當(dāng)遇到下列情況時(shí),copy不能實(shí)現(xiàn)完全的傳值操作。

a = [1,2,3,[10,20,30]]
b = a.copy()
print(id(a))
print(id(b))
print(id(a[3]))
print(id(b[3]))
a[3][2] = 666
print(a)
print(b)
96141704
93355400
96141768
96141768
[1, 2, 3, [10, 20, 666]]
[1, 2, 3, [10, 20, 666]]

要解決這個(gè)問(wèn)題,需要使用deepcopy。python3中,直接可以使用copy()方法,但deepcopy()還是需要導(dǎo)入copy模塊。

import copy
a = [1,2,3,[10,20,30]]
b = copy.deepcopy(a)
print(id(a))
print(id(b))
print(id(a[3]))
print(id(b[3]))
a[3][2] = 666
print(a)
print(b)
96503944
93002376
96886024
93352712
[1, 2, 3, [10, 20, 666]]
[1, 2, 3, [10, 20, 30]]

5. tuple操作

tuple元組是不可修改的,指的是其元組內(nèi)容不可改。

t1 = (1,2,3)
t1[1] = 100
---------------------------------------------------------------------------
TypeError                 Traceback (most recent call last)
<ipython-input-19-9caf76a526a9> in <module>()
   1 t1 = (1,2,3)
----> 2 t1[1] = 100
TypeError: 'tuple' object does not support item assignment

但是其所指向的內(nèi)存地址是可變的。

t1 = (1,2,3)
t2 = (5,6,7)
print(id(t1))
t1 += t2
print(t1)
print(id(t1))
print(id(t2))
t2 *= 3
print(t2)
print(id(t2))
96151520
(1, 2, 3, 5, 6, 7)
93048552
94080672
(5, 6, 7, 5, 6, 7, 5, 6, 7)
93656912

并不是起初的t1和t2所指向的元組內(nèi)容發(fā)生了變化,而是新分配了兩個(gè)元組內(nèi)存,t1和t2所指向的內(nèi)存發(fā)生改變。

總結(jié)

相關(guān)文章

  • 關(guān)于Python的一些學(xué)習(xí)總結(jié)

    關(guān)于Python的一些學(xué)習(xí)總結(jié)

    這篇文章主要介紹了關(guān)于Python的一些總結(jié),希望自己以后在學(xué)習(xí)Python的過(guò)程中可以邊學(xué)習(xí)邊總結(jié),就自己之前的學(xué)習(xí)先做以總結(jié),之后將不斷總結(jié)更新
    2018-05-05
  • Python高級(jí)文件操作之shutil庫(kù)詳解

    Python高級(jí)文件操作之shutil庫(kù)詳解

    這篇文章主要介紹了Python高級(jí)文件操作之shutil庫(kù)詳解,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們有很大的幫助,需要的朋友可以參考下
    2021-05-05
  • Python運(yùn)算符之Inplace運(yùn)算符的使用教程

    Python運(yùn)算符之Inplace運(yùn)算符的使用教程

    Inplace運(yùn)算符的行為與普通運(yùn)算符相似,只是在可變目標(biāo)和不可變目標(biāo)的情況下它們以不同的方式起作用。本文將通過(guò)示例帶大家了解Inplace運(yùn)算符的使用,需要的可以參考一下
    2022-09-09
  • 使用Python解析JSON數(shù)據(jù)的基本方法

    使用Python解析JSON數(shù)據(jù)的基本方法

    這篇文章主要介紹了使用Python解析JSON數(shù)據(jù)的基本方法,是Python入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-10-10
  • python中__call__內(nèi)置函數(shù)用法實(shí)例

    python中__call__內(nèi)置函數(shù)用法實(shí)例

    這篇文章主要介紹了python中__call__內(nèi)置函數(shù)用法,實(shí)例分析了python中__call__內(nèi)置函數(shù)的原理與使用技巧,需要的朋友可以參考下
    2015-06-06
  • 測(cè)試、預(yù)發(fā)布后用python檢測(cè)網(wǎng)頁(yè)是否有日常鏈接

    測(cè)試、預(yù)發(fā)布后用python檢測(cè)網(wǎng)頁(yè)是否有日常鏈接

    難免會(huì)碰到秀逗了把測(cè)試的鏈接發(fā)布到線上的情況,一般這種都是通過(guò)一些測(cè)試的檢查工具來(lái)檢查鏈接來(lái)規(guī)避風(fēng)險(xiǎn)的,下面為大家簡(jiǎn)述下大概的實(shí)現(xiàn)思路
    2014-06-06
  • Python實(shí)現(xiàn)訪問(wèn)者模式詳情

    Python實(shí)現(xiàn)訪問(wèn)者模式詳情

    這篇文章主要介紹了Python實(shí)現(xiàn)訪問(wèn)者模式詳情,訪問(wèn)者模式,指作用于一個(gè)對(duì)象結(jié)構(gòu)體上的元素的操作。訪問(wèn)者可以使用戶在不改變?cè)摻Y(jié)構(gòu)體中的類的基礎(chǔ)上定義一個(gè)新的操作,下文更多相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • 一個(gè)非常簡(jiǎn)單好用的Python圖形界面庫(kù)(PysimpleGUI)

    一個(gè)非常簡(jiǎn)單好用的Python圖形界面庫(kù)(PysimpleGUI)

    這篇文章主要介紹了一個(gè)非常簡(jiǎn)單好用的Python圖形界面庫(kù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 一文詳解Python灰色預(yù)測(cè)模型實(shí)現(xiàn)示例

    一文詳解Python灰色預(yù)測(cè)模型實(shí)現(xiàn)示例

    這篇文章主要為大家介紹了Python灰色預(yù)測(cè)模型實(shí)現(xiàn)示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Python .format()函數(shù)使用方法詳解

    Python .format()函數(shù)使用方法詳解

    python中format函數(shù)用于字符串的格式化,接下來(lái)通過(guò)本文給大家介紹python中format()函數(shù)的簡(jiǎn)單使用教程,一起看看吧
    2021-10-10

最新評(píng)論

麦盖提县| 乌兰浩特市| 天全县| 济源市| 双城市| 镇康县| 阿尔山市| 丰县| 基隆市| 卓资县| 托克托县| 米林县| 苗栗县| 盐源县| 大连市| 宣化县| 密山市| 道真| 武隆县| 兴义市| 韶山市| 武川县| 册亨县| 太谷县| 仁布县| 广宗县| 聂拉木县| 平邑县| 莎车县| 济阳县| 延庆县| 莒南县| 延寿县| 白城市| 织金县| 昭觉县| 若尔盖县| 久治县| 宜黄县| 江永县| 兰州市|