python怎么设置颜色深浅变化_Python赋值、深浅copy
Python賦值、深淺copy
assignment:
在 Python 中,對(duì)象的賦值就是簡(jiǎn)單的對(duì)象引用,這點(diǎn)和 C++不同,如下所示
a = [1, 2, 'hello', ['python', 'C++']]
b = a
在上述情況下,a 和 b 是一樣的,他們指向同一片內(nèi)存,b 不過(guò)是 a 的別名,是引用.
我們可以使用 b is a 去判斷,返回 True,表明他們地址相同,內(nèi)容相同,也可以使用 id()函數(shù)來(lái)查看兩個(gè)列表的地址是否相同。
賦值操作(包括對(duì)象作為參數(shù)、返回值)不會(huì)開辟新的內(nèi)存空間,它只是復(fù)制了對(duì)象的引用。也就是說(shuō)除了 b 這個(gè)名字之外,沒(méi)有其他的內(nèi)存開銷。修改了 a,也就影響了 b,同理,修改了 b,也就影響了 a。
shallow copy:
淺拷貝會(huì)創(chuàng)建新對(duì)象,其內(nèi)容非原對(duì)象本身的引用,而是原對(duì)象內(nèi)第一層對(duì)象的引用。
淺拷貝有三種形式:
切片操作
b = a[:]
c = [x for x in a]
工廠函數(shù)
b = list(a)
copy 模塊中的 copy 函數(shù)
b = copy.copy(a)
?淺拷貝產(chǎn)生的列表 b 不再是列表 a 了,使用 is 判斷可以發(fā)現(xiàn)他們不是同一個(gè)對(duì)象,使用 id 查看,他們也不指向同一片內(nèi)存空間。但是當(dāng)我們使用 id(x) for x in a 和 id(x) for x in b 來(lái)查看 a 和 b 中元素的地址時(shí),可以看到二者包含的元素的地址是相同的。
?在這種情況下,列表 a 和 b 是不同的對(duì)象,修改列表 b 理論上不會(huì)影響到列表 a。但是要注意的是,淺拷貝之所以稱之為淺拷貝,是它僅僅只拷貝了一層,在列表 a 中有一個(gè)嵌套的list,如果我們修改了它,情況就不一樣了。
?比如:a[3].append('java')。查看列表 b,會(huì)發(fā)現(xiàn)列表 b 也發(fā)生了變化,這是因?yàn)?#xff0c;我們修改了嵌套的 list,修改外層元素,會(huì)修改它的引用,讓它們指向別的位置,修改嵌套列表中的元素,列表的地址并未發(fā)生變化,指向的都是用一個(gè)位置。
deep copy:
深拷貝只有一種形式,copy 模塊中的 deepcopy()函數(shù)。
深拷貝和淺拷貝對(duì)應(yīng),深拷貝拷貝了對(duì)象的所有元素,包括多層嵌套的元素。因此,它的時(shí)間和空間開銷要高。
同樣的對(duì)列表 a,如果使用 b = copy.deepcopy(a),再修改列表 b 將不會(huì)影響到列表 a,即使嵌套的列表具有更深的層次,也不會(huì)產(chǎn)生任何影響,因?yàn)樯羁截惪截惓鰜?lái)的對(duì)象根本就是一個(gè)全新的對(duì)象,不再與原來(lái)的對(duì)象有任何的關(guān)聯(lián)
拷貝注意點(diǎn):
對(duì)于非容器類型,如數(shù)字、字符,以及其他的“原子”類型,沒(méi)有拷貝一說(shuō),產(chǎn)生的都是原對(duì)象的引用。
如果元組變量值包含原子類型對(duì)象,即使采用了深拷貝,也只能得到淺拷貝。
面試題
import copy
a = [1, 2, 3, [4, 5], 6]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
b.append(10)
c[3].append(11)
d[3].append(12)
print(a, b, c, d, sep='\n')
"""
[1, 2, 3, [4, 5, 11], 6, 10]
[1, 2, 3, [4, 5, 11], 6, 10]
[1, 2, 3, [4, 5, 11], 6]
[1, 2, 3, [4, 5, 12], 6]
"""
總結(jié)
以上是生活随笔為你收集整理的python怎么设置颜色深浅变化_Python赋值、深浅copy的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: wps页面设置在哪?(window10让
- 下一篇: python3程序转python2_py