真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

[Python]正確復(fù)制列表的方法-創(chuàng)新互聯(lián)

new = old[:]

Python老鳥都知道以上代碼是什么意思。它復(fù)制列表old到new。它對于新手來說是種困惑而且應(yīng)該避免使用這種方法。不幸的是[:]標(biāo)記法被廣泛使用,可能是Python程序員不知道更好的列表復(fù)制法吧。

專注于為中小企業(yè)提供網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)服務(wù),電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)滎陽免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了千余家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。

首先我們需要了解Python是如何管理對象和變量。Python沒有C語言中的變量。在C語言中,變量不止是個名字,它是字節(jié)集合并真實存在于內(nèi)存某個位置上。而在Python中,變量僅僅是指向?qū)ο蟮臉?biāo)簽。

看看以下語句:

a = [1, 2, 3]

它表示我們創(chuàng)建了一個指引指向列表[1, 2, 3],但是a不是列表。如果:

b = a

我們并沒有復(fù)制a所指引的列表。我們只是創(chuàng)建了一個新的標(biāo)簽b,然后將其指向a所指向的列表。

如果你修改a,那你就同時修改了b,因為它們指向同一個列表:

>>> a = [1, 2, 3]
>>> b = a
>>> a.append(4)
>>> print a
[1, 2, 3, 4]
>>> print b
[1, 2, 3, 4]

內(nèi)建函數(shù)id()可以返回對象的唯一id。該id是對象的內(nèi)存地址。

>>> id(a)
3086056
>>> id(b)
3086056
>>> c = [] # Create a new list>>> id(c)
2946712

可以看出a和b都指向同一個內(nèi)存地址。c指向一個新建的空列表,因此指向了不同的地址。

現(xiàn)在我們要復(fù)制a指引的列表。我們必須創(chuàng)建新的列表,然后使用b指引它。

這其實就是 new = old[:]。切片運算符[:]返回一個序列的切片。切片過程是切下列表的一部分,創(chuàng)建新的列表,將切下的部分復(fù)制到新列表。

>>> a[1:3]
[2, 3]
>>> id(a)
3086056
>>> id(a[1:3])
3063400

省略第一個索引值,切片從列表開始,省略第二個索引值,切片直到列表末端。

>>> a[:3]
[1, 2, 3]
>>> a[1:]
[2, 3, 4]

通過調(diào)用a[:],我們得到一個從列表首端開始到末端的切片,也就是a(指引的列表)的完整復(fù)制。但這不是復(fù)制列表的唯一方式??纯聪旅孢@個情況:

>>> b = list(a)
>>> id(a)
3086056
>>> id(b)
3086256

這個是不是看起來更好,少一些隱式,更加pythonic?a[:]看起來有點太像Perl。不同于切片標(biāo)記法,不了解Python的人也會明白b是一個列表。

list()是列表構(gòu)造函數(shù)。它會在傳入的數(shù)列基礎(chǔ)上新建一個列表。數(shù)列不一定是列表,它可以是任何類型的數(shù)列。

>>> my_tuple = (1, 2, 3)
>>> my_list = list(my_tuple)
>>> print my_list
[1, 2, 3]
>>> id(my_tuple)
3084496
>>> id(my_list)
3086336

而且它還接受生成器。切片筆記法不適用于生成器,因為生成器是不可更改。你不能generator[0],例如:

>>> generator = (x * 3 for x in range(4))
>>> list(generator)
[0,3, 6, 9]

百分之九十的切片標(biāo)記法都可以被list()代替。下次你看見[:]的時候試試使用list()替代,這樣可以讓你的代碼更加可讀。記住,魔鬼藏在細(xì)節(jié)里。

附:五種復(fù)制方法的比較

>>> import copy
>>> a = [[10], 20]
>>> b = a[:]
>>> c = list(a)
>>> d = a * 1
>>> e = copy.copy(a)
>>> f = copy.deepcopy(a)
>>> a.append(21)
>>> a[0].append(11)
>>> print id(a), a
30553152 [[10, 11], 20, 21]
>>> print id(b), b
44969816 [[10, 11], 20]
>>> print id(c), c
44855664 [[10, 11], 20]
>>> print id(d), d
44971832 [[10, 11], 20]
>>> print id(e), e
44833088 [[10, 11], 20]
>>> print id(f), f
44834648 [[10], 20]

從以上可以看出,使用 a[:], list(a), a*1, copy.copy(a)四種方式復(fù)制列表結(jié)果都可以得到一個新的列表,但是如果列表中含有列表,所有b, c, d, e四個新列表的子列表都是指引到同一個對象上。只有使用copy.deepcopy(a)方法得到的新列表f才是包括子列表在內(nèi)的完全復(fù)制。

查看原文


新聞標(biāo)題:[Python]正確復(fù)制列表的方法-創(chuàng)新互聯(lián)
文章分享:http://weahome.cn/article/dippph.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部