python中序列使用的小坑

開發(fā)中,我們時常會使用序列操作:

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

5*'abc'
>>>'abcabcabcabcabc'

python中 + 和 * 都有這個規(guī)律,不修改原有的操作對象,而是構(gòu)建一個全新的序列

我們現(xiàn)在來看兩個例子:
一個包含三個列表的列表

board = [['_'] * 3 for i in range(3)]
board
>>>[['_', '_', '_'], ['_', '_', '_'], ['_', '_', '_']]

board[1][2] = 'x'
>>>[['_', '_', '_'], ['_', '_', 'x'], ['_', '_', '_']]

這里我們看到我們成功的修改了預期值,我們再看下一個例子
用更簡單的建立序列的方法

weird_board = [['_'] * 3] * 3

這樣建立是不是比上面的例子要簡單的多,但是這個序列有一個問題,就是這個序列里面的的三個對象的指針都是指向同一個地方,

In [33]: for i in [['_'] * 3] * 3:
    ...:     print(id(i))

4446930504
4446930504
4446930504

看到三個對象的內(nèi)存地址是一致的,那我們再來看看上一個列子里面的對象地址

In [34]: for i in [['_'] * 3 for i in range(3)]:
    ...:     print(id(i))
    ...:
4447022600
4446945352
4446421896

可以清楚的看到三個地址是不一致的,
這就說明了一個問題:for 循環(huán)是連續(xù)添加新對象進入列表

現(xiàn)在我們來修改下其中的一個值

In [39]: weird_board[1][2] = 'x'

In [40]: weird_board
Out[40]: [['_', '_', 'x'], ['_', '_', 'x'], ['_', '_', 'x']]

問題出現(xiàn)了,我們只是修改了一個位置的值,但是三個對象全變了,
這個問題的實質(zhì)還是這就是對象列表里面的一個小坑,希望大家在開發(fā)的時候注意這點。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,688評論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,319評論 25 708
  • 歲月是一首磨人的歌,黯然的,帶走了青春年華,只剩下千瘡百孔的面容。 劉先生 夜晚的街道繼承著白日的喧囂,燈光,...
    hero_5ff9閱讀 383評論 0 1

友情鏈接更多精彩內(nèi)容