在程式進行像 a = b 這樣的賦值時,就會建立乙個對b的新引用。對於像數字和字串這種的不可變物件。這種賦值實際上是建立了b的副本。然而,對於可變物件(如列表和字典)引用行為會完全不同
例項**:(對應的輸出已經在相應的行標註)
#!/usr/bin/python
#coding: utf-8
a = [1, 2, 3, 4]
b = a
print b is a # b和a是同一物件 true
b[0] = 100 # 改變b[0]的值
print b # [100, 2, 3, 4]
print a # a[0]的值也發生改變 [100, 2, 3, 4]
# 因為 b 和 a 指向同乙個物件,修改其中任意乙個都會影響到另乙個。為了避免這種情況,
# 必須建立物件的副本而不是新的引用
# 對於像列表和字典這樣的容器物件,可以使用兩種複製操作:淺複製和深複製。
# 淺複製將建立乙個新的物件,但它包含的是原始物件中包含的項的引用。
a = [1, 2, [3, 4]]
b = list(a) # 建立a的乙個淺複製
print b is a # 此時a 和 b不是同一物件 false
print b # [1, 2, [3, 4], 100]
print a # a中的值沒有變化 [1, 2, [3, 4]]
b[2][0] = -100 # 修改b中的乙個元素
print b # [1, 2, [-100, 4], 100]
print a # a也發生變化 [1, 2, [-100, 4]]
b[0] = 100 # 這樣改變並不會修改a列表的值
print b # [100, 2, [-100, 4], 100]
print a # [1, 2, [-100, 4]]
a[0] = 10 # 只有a的值發生改變
print b # [100, 2, [-100, 4], 100]
print a # [10, 2, [-100, 4]]
# a 和 b 是單獨的列表物件,但是它們包含的元素是共享的。因此,
# 修改b的乙個元素也會修改a中對應的元素
# 深複製將建立乙個新物件,並且遞迴地複製它所包含的所有物件。沒有內建操作可建立
# 物件的深複製,但可以使用標準庫的copy.deepcopy()函式完成該工作。
import copy
a = [1, 2, [3, 4] ]
b = copy.deepcopy(a)
b[2][0] = -100
print b # [1, 2, [-100, 4]]
print a # 此時a的值並沒有發生改變 [1, 2, [3, 4]]
python 引用與複製
a b 這樣的賦值,就會建立對b的引用,對於象數字和字串這樣的不可變的物件,這種賦值實際是建立了b的乙個副本 a hello b a id a id b b is a true a 1000 b hello 對於可變物件,比如字典和列表,a和b引用的是同乙個物件,修改其中任意乙個變數都會影響到另乙個...
Python中字典的複製和引用
author lxp 自定義函式 a p2 def myfunc pinfo print print pinfo pinfo 33 pinfo 33 0.0088 print pinfo pinfo 33 0.0044 print pinfo print myp p a print myp.ps m...
Python中引用複製 分片複製 完整複製
首先直接看例子 l1 1,2,3 l11 l1 l2 4,5,l1 l2 4,5,1,2,3 l3 l2 l3 4,5,1,2,3 import copy l4 copy.deepcopy l2 l4 4,5,1,2,3 l2 1 6 l2 4,6,1,2,3 l3 4,5,1,2,3 l4 4,5...