可變對(duì)象暖释、不可變對(duì)象袭厂、賦值、引用球匕、拷貝纹磺、作用域

refer:
http://www.reibang.com/p/c5582e23b26c
https://my.oschina.net/leejun2005/blog/145911

不可變對(duì)象

  • int, float, string, tuple
j = 2333
i = j
k = 2333

print id(i)
print id(j)
pring id(k)
print i is j
print j is k 

print 'after j +1'
j = j + 1
print id(j)
print i

# output:
140565451698264
140565451698264
140565451698264
True
True
after j +1
2333
2334
140565451698216
  • 不可變對(duì)象(2333)在內(nèi)存地址(140565451698264)中存放后,該值就不可變了亮曹;一旦去改變(j = j + 1)實(shí)際上是重新分配了內(nèi)存地址(140565451698216),新地址存的是所賦的值(j+1)橄杨,j 再指向新的內(nèi)存地址。
  • refer中的例子圖很形象:


    image.png

可變對(duì)象

  • list, dict, set
a = dict()
b = a
a["k"] = "v"
print "a id: {}".format(id(a))
print "b id: {}".format(id(b))
print b

# output:
a id: 4416436776
b id: 4416436776
{'k': 'v'}

可變對(duì)象a的地址是4416436776,a賦值給b后照卦,實(shí)際是a和b指向同一個(gè)內(nèi)存地址式矫。
上述可見,改變a的值就是直接在該內(nèi)存空間直接改變存儲(chǔ)對(duì)象的值役耕,所以b的內(nèi)容也跟著變化了采转。
refer中的圖例:

image.png

函數(shù)的參數(shù)傳遞

python里的規(guī)則是函數(shù)的參數(shù)傳遞都是傳遞引用,即傳入?yún)?shù)的內(nèi)存地址蹄葱。表面看氏义,函數(shù)內(nèi)部對(duì)參數(shù)的改變會(huì)影響參數(shù)本身。
但python有可變對(duì)象和不可變對(duì)象图云,結(jié)合上文可知惯悠,

  • 參數(shù)是可變對(duì)象類型的時(shí)候,函數(shù)如果對(duì)參數(shù)有變動(dòng)會(huì)影響參數(shù)本身的值(“引用傳遞”)竣况,這個(gè)跟C的指針很像
  • 參數(shù)是不可變對(duì)象類型的時(shí)候克婶,函數(shù)對(duì)參數(shù)的變動(dòng)實(shí)際上是重新分配了內(nèi)存空間的,所以參數(shù)本身值不受影響(值傳遞)
def test(a_int, b_list):
    a_int = a_int + 1
    b_list.append('13')
    print('inner a_int:' + str(a_int))
    print('inner b_list:' + str(b_list))

a_int = 5
b_list = [10, 11]
test(a_int, b_list)
print('outer a_int:' + str(a_int))
print('outer b_list:' + str(b_list))

# output:
inner a_int:6

inner b_list:[10, 11, '13']

outer a_int:5

outer b_list:[10, 11, '13']

示例講解

  • 在 python 中賦值語句總是建立對(duì)象的引用值丹泉,而不是復(fù)制對(duì)象情萤。因此,python 變量更像是指針摹恨,而不是數(shù)據(jù)存儲(chǔ)區(qū)域筋岛,
lst = [0,1,2]
lst[1] = lst
lst 

# output:
[0, [...], 2]

可以說 Python 沒有賦值,只有引用晒哄。你這樣相當(dāng)于創(chuàng)建了一個(gè)引用自身的結(jié)構(gòu)睁宰,所以導(dǎo)致了無限循環(huán)

image.png

  • 通過lst[:]形式來復(fù)制操作得到新對(duì)象
lst = [0,1,2]
lst[1] = lst[:]
lst 

# output:
[0, [0,1,2], 2]

生成對(duì)象的拷貝或者是復(fù)制序列肪获,不再是引用和共享變量,但此法只能頂層復(fù)制


image.png
  • 往更深處說柒傻,values[:] 復(fù)制操作是所謂的「淺復(fù)制」(shallow copy)
a = [0, [1, 2], 3]
b = a[:]
a[0] = 8
a[1][1] = 9

a # [8, [1, 9], 3]
b # [0, [1, 9], 3] 
image.png
  • 通過copy.deepcopy來【深復(fù)制】(實(shí)際上應(yīng)該是遞歸進(jìn)行copy)
import copy

a = [0, [1, 2], 3]
b = copy.deepcopy(a)
a[0] = 8
a[1][1] = 9

a # [8, [1, 9], 3]
b #  [0, [1, 2], 3]
image.png
  • 字典 copy 方法孝赫,D.copy() 能夠復(fù)制字典,但此法只能淺層復(fù)制

對(duì)可變對(duì)象處理+=需要注意

x = x + y红符,x 出現(xiàn)兩次青柄,必須執(zhí)行兩次,性能不好预侯,合并必須新建對(duì)象 x致开,然后復(fù)制兩個(gè)列表合并

屬于復(fù)制/拷貝

x += y,x 只出現(xiàn)一次萎馅,也只會(huì)計(jì)算一次喇喉,性能好,不生成新對(duì)象校坑,只在內(nèi)存塊末尾增加元素。

當(dāng) x千诬、y 為list時(shí)耍目, += 會(huì)自動(dòng)調(diào)用 extend 方法進(jìn)行合并運(yùn)算,in-place change徐绑。

屬于共享引用

L = [1, 2]
M = L
L = L + [3, 4]
print L, M
print "-------------------"
L = [1, 2]
M = L
L += [3, 4]
print L, M


[1, 2, 3, 4] [1, 2]
-------------------
[1, 2, 3, 4] [1, 2, 3, 4]

陷阱:使用可變的默認(rèn)參數(shù)

In[2]: def foo(a, b, c=[]):
...        c.append(a)
...        c.append(b)
...        print(c)
...
In[3]: foo(1, 1)
[1, 1]
In[4]: foo(1, 1)
[1, 1, 1, 1]
In[5]: foo(1, 1)
[1, 1, 1, 1, 1, 1]

同一個(gè)變量c在函數(shù)調(diào)用的每一次都被反復(fù)引用邪驮。這可能有一些意想不到的后果。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末傲茄,一起剝皮案震驚了整個(gè)濱河市毅访,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌盘榨,老刑警劉巖喻粹,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異草巡,居然都是意外死亡守呜,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門山憨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來查乒,“玉大人,你說我怎么就攤上這事郁竟÷昶” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵棚亩,是天一觀的道長(zhǎng)蓖议。 經(jīng)常有香客問我虏杰,道長(zhǎng),這世上最難降的妖魔是什么拒担? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任嘹屯,我火速辦了婚禮,結(jié)果婚禮上从撼,老公的妹妹穿的比我還像新娘州弟。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著却汉,像睡著了一般妓雾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上梢褐,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼最蕾。 笑死,一個(gè)胖子當(dāng)著我的面吹牛老厌,可吹牛的內(nèi)容都是我干的瘟则。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼枝秤,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼醋拧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起淀弹,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤丹壕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后薇溃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體菌赖,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年痊焊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了盏袄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡薄啥,死狀恐怖辕羽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情垄惧,我是刑警寧澤刁愿,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站到逊,受9級(jí)特大地震影響铣口,放射性物質(zhì)發(fā)生泄漏滤钱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一脑题、第九天 我趴在偏房一處隱蔽的房頂上張望件缸。 院中可真熱鬧,春花似錦叔遂、人聲如沸他炊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽痊末。三九已至,卻和暖如春哩掺,著一層夾襖步出監(jiān)牢的瞬間凿叠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工嚼吞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留盒件,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓舱禽,卻偏偏與公主長(zhǎng)得像履恩,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子呢蔫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容