日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python可变序列中的一些坑

發(fā)布時間:2025/3/20 python 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python可变序列中的一些坑 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

聽說面試官比較喜歡這些坑。
函數(shù)默認參數(shù)可變

默認參數(shù)有個最大的坑,演示如下:
先定義一個函數(shù),傳入一個 list,添加一個END再返回:

def add_end(L=[]):L.append('END')return L

當你正常調(diào)用時,結果似乎不錯:

''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' >>> add_end([1, 2, 3]) [1, 2, 3, 'END'] >>> add_end(['x', 'y', 'z']) ['x', 'y', 'z', 'END']

當你使用默認參數(shù)調(diào)用時,一開始結果也是對的:

>>> add_end() ['END']

但是,再次調(diào)用add_end()時,結果就不對了:

>>> add_end() ['END', 'END'] >>> add_end() ['END', 'END', 'END']

很多初學者很疑惑,默認參數(shù)是[],但是函數(shù)似乎每次都“記住了”上次添加了’END’后的 list。

原因解釋如下:

Python 函數(shù)在定義的時候,默認參數(shù)L的值就被計算出來了,即[],因為默認參數(shù)L也是一個變量,它指向對象[],每次調(diào)用該函數(shù),如果改變了L的內(nèi)容,則下次調(diào)用時,默認參數(shù)的內(nèi)容就變了,不再是函數(shù)定義時的[]了。

定義默認參數(shù)要牢記一點:默認參數(shù)必須指向不變對象!

要修改上面的例子,我們可以用None這個不變對象來實現(xiàn):

''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' def add_end(L=None):if L is None:L = []L.append('END')return L

現(xiàn)在,無論調(diào)用多少次,都不會有問題:

>>> add_end() ['END'] >>> add_end() ['END']

序列中存儲同一個可變對象的多個引用

如果想要把一個序列復制幾份然后再拼接起來,可以把這個序列乘一個整數(shù),這個操作會產(chǎn)生一個新序列:

>>> l = [1, 2, 3] >>> l * 3 [1, 2, 3, 1, 2, 3, 1, 2, 3]

如果在a n這個語句中,序列 a
里的元素是對其他可變對象的引用的話,你就需要格外注意了,因為這個式子的結果可能會出乎意料。

比如,你想用my_list = [[]]
3來初始化一個由列表組成的列表,但是你得到的列表里包含的 3 個元素其實是 3 個引用,而且這 3
個引用指向的都是同一個列表。這可能不是你想要的結果。
下面來看看如何初始化一個由列表組成的列表。`

''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' # 示例:一個包含3個列表的列表,嵌套的3個列表各自有3個元素來代表井字游戲的一行方塊 >>> board = [['_'] * 3 for i in range(3)] >>> board [['_', '_', '_'], ['_', '_', '_'], ['_', '_', '_']] >>> board[1][2] = 'X' >>> board [['_', '_', '_'], ['_', '_', 'X'], ['_', '_', '_']]# 等價于下面這種寫法 >>> board = [] >>> for i in range(3): ... row = ['_'] * 3 ... board.append(row) ... >>> board [['_', '_', '_'], ['_', '_', '_'], ['_', '_', '_']] >>> board[2][0] = 'X' >>> board [['_', '_', '_'], ['_', '_', '_'], ['X', '_', '_']]

下面展示了另一個方法,這個方法看上去是個誘人的捷徑,但實際上它是錯的。

''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' >>> weird_board = [['_'] * 3] * 3 >>> weird_board [['_', '_', '_'], ['_', '_', '_'], ['_', '_', '_']] >>> weird_board[1][2] = 'O' >>> weird_board [['_', '_', 'O'], ['_', '_', 'O'], ['_', '_', 'O']]# 等價于下面這種寫法 >>> row = ['_'] * 3 >>> board = [] >>> for i in range(3): ... board.append(row)

含有 3 個指向同一對象的引用的列表是毫無用處的。
當我們不做修改的時候,看起來都還好。一旦我們試圖標記第 1 行第 2 列的元素,就立馬暴露了列表內(nèi)的 3 個引用指向同一個對象的事實。

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的Python可变序列中的一些坑的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。