摘要:沒想到會被轉發。看來眼球多了的確容易糾錯。有時候你已經用它寫了數萬行代碼,自以為很熟了。賦值最簡單的賦值到底發生了什么呢一個變量被賦值了太籠統了吧。也就是說是把同一個對象傳給了。這里,所綁定的對象的確被傳進來了,的確生成了一個新對象。
[EDIT] 沒想到會被轉發。很高興也很囧。看來眼球多了的確容易糾錯。要小心啊小心。
編程語言就是這樣。有時候你已經用它寫了數萬行代碼,自以為很熟了。知道某一天遇到一個意料之外的問題。然后你才發現,原來TMD是這樣的。
問題def change(l1, l2): l1.append(10) l2 = [7, 5, 3, 1] list1 = [1, 3, 5, 7] list2 = [3, 3, 3, 3] change(list1, list2) print(list1) print(list2)
以上這段代碼的輸出是什么?如果你的答案是
[1, 3, 5, 7, 10] [3, 3, 3, 3]
那么大牛請安靜的離開。如果不是,可以讀一下下面的故事。
賦值最簡單的賦值
list1 = [1, 3, 5, 7]
到底發生了什么呢?一個變量list1被賦值了?太籠統了吧。
對于Python來說,Everything is an object。上面這行代碼其實是這樣的:
創建一個list對象
創建一個名字
綁定
再來看個例子:
s1 = "hello" s2 = "hello" print(s1 is s2)
這個會輸出什么?True! 因為是這樣的:
創建一個string對象
創建名字s1并綁定到string對象
創建名字s2并綁定到string對象
而s1和s2綁定的是同一個對象!
漲姿勢了。那么問題又來了:
l1 = [1, 3, 5, 7] l2 = [1, 3, 5, 7] print(l1 is l2)
結果是?。。。。。。一定是True了吧?錯!
這里又有一個很重要的概念。Mutable 和 immutable。"hello"和[1, 3, 5, 7]的區別就在于:前者是Immutable而后者是Mutable。對于可變的對象,Python會自動生成全新的對象,以確保各對象可以獨立的變動。而不可變的就不需要 - 節省內存。
傳參回到開始的問題。當list1被傳給change()的時候,到底是什么被傳過去了?讓我們來做一個小實驗。在傳入前和change()內部各加入一個語句
print(id(list1))
和
print(id(l1))
這里要解釋一下,Python的每一個對象都有一個唯一的hash id。id()這個函數就是用來打印出這個id的。加了上面兩行之后,我們會發現。在change()函數之外與之內,兩個值是一樣的。也就是說Python是把同一個對象傳給了change()。
這下我們就可以理解為什么list1在調用了change()之后被改動了。但是那么list2也應該被改動了才對啊?非也。這里,list2所綁定的對象的確被傳進來了,的確生成了一個新list對象。但是這個對象被綁定給了l2。跟list2沒半毛錢關系。我們在做一個實驗驗證一下。
def change(l1, l2): l1.append(10) l2 = [7, 5, 3, 1] list1 = [1, 3, 5, 7] list2 = [3, 3, 3, 3] change(list1, list2) print(list1) print(list2) import dis dis.dis(change)
對比開始的代碼,我們加入了最后兩句。這個兩句使用了dis模塊把change反編譯了。結果如下:
2 0 LOAD_FAST 0 (l1)
3 LOAD_ATTR 0 (append) 6 LOAD_CONST 1 (10) 9 CALL_FUNCTION 1 12 POP_TOP
3 13 LOAD_CONST 2 (7)
16 LOAD_CONST 3 (5) 19 LOAD_CONST 4 (3) 22 LOAD_CONST 5 (1) 25 BUILD_LIST 4 28 STORE_FAST 1 (l2) 31 LOAD_CONST 0 (None) 34 RETURN_VALUE
對應原來的行號3,我們可以看到,Python用4個常數build了一個list。然后把這個綁定到了名字l2然后就返回了。
至此真相大白。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/38150.html
摘要:返回元組中元素最大值。將列表轉換為元組。如果相對元組排序,通常先得將它轉換為列表并使其成為一個可變對象,才能獲得使用排序方法,或使用內置方法。 比List更安全的數據類型 大家好,今天為大家介紹一種更為安全的Python內置數據類型:tuple(元組),以及它的基礎用法 元組是什么 元組(tuple)是另一種有序的數據類型,與list比較類似。主要不同的一點是tuple被創建后就不能對...
摘要:所謂金三銀四金九銀十說的就是招聘季。大家想過沒有,為什么是金三銀四金九銀十就連蘋果輸入法也知道這事情因為現在大多數的大學寒假都是放到月份前后,暑假是在月份前后。 今天終于有時間好好給大家寫寫關于如何寫簡歷,給自己加分了。 這篇文章拖了很久了應該說,本來想在上周寫的,但是事情實在是太多,又不想草草了事,所以擱置到現在。今天早上正好空出來了,就馬上給大家碼出來了。 showImg(http...
摘要:判斷奇數是迭代器會根據提供的函數對指定序列做映射語法可以對可迭代對象中的每一個元素進行映射。 python內置庫詳解 1、引言2、內置庫詳解2.1 數據相關2.1...
摘要:前端準備前端了解過關了嗎前端基礎架構和硬核介紹技術棧的選擇首先我們構建前端架構需要對前端生態圈有一切了解,并且最好帶有一定的技術前瞻性,好的技術架構可能日后會方便的擴展,減少重構的次數,即使重構也不需要大動干戈,我通常選型技術棧會參考以下三 # 前端準備 :前端了解過關了嗎?前端基礎架構和硬核介紹 showImg(https://segmentfault.com/img/remote/...
閱讀 3675·2021-11-16 11:41
閱讀 2880·2021-09-23 11:45
閱讀 687·2019-08-30 15:44
閱讀 538·2019-08-30 13:10
閱讀 1961·2019-08-30 12:49
閱讀 3526·2019-08-28 17:51
閱讀 1471·2019-08-26 12:20
閱讀 698·2019-08-23 17:56