python引用和複製

2021-07-24 23:12:18 字數 1411 閱讀 5877

在程式進行像 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...