開發(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ā)的時候注意這點。