**
1,传递可变对象
**
b = [10, 20]
print(id(b))
def test(m): # b和m是同一个对象
m.append(30) # 由于m是可变对象 ,在函数中不创建新的对象拷贝。可直接调用append()方法修改这个对象
print(m, id(m))
test(b)
print(b, id(b))
**
2,传递不可变对象
**
传递不可变对象属于浅拷贝
a = 100
def f1(n):
print(n, id(n)) # 传递过来的是a对象的地址
n = n + 200 #由于a是不可变对象 因此创建了新的对象n
print(n, id(n)) #n变成了新的对象
f1(a)
print(a, id(a))
运行结果如下:
100 1989259456
300 1802634698480
100 1989259456
**
3,浅拷贝
**
不拷贝子对象的内容,只考贝子对象的引用
import copy
a = [10, 20, [5, 6]]
b = copy.copy(a)
print("a", a)
print("b", b)
b.append(30)
b[2].append(7)
print("浅拷贝....")
print("a", a)
print("b", b)
运行结果如下:
a [10, 20, [5, 6]]
b [10, 20, [5, 6]]
浅拷贝....
a [10, 20, [5, 6, 7]]
b [10, 20, [5, 6, 7], 30]
**
4,深拷贝
**
会连子对象的内存也全部拷贝一份,对子对象的修改不会影响源对象
import copy
a = [10, 20, [5, 6]]
b = copy.deepcopy(a)
print("a", a)
print("b", b)
b.append(30)
b[2].append(7)
print("深拷贝....")
print("a", a)
print("b", b)
运行结果如下:
a [10, 20, [5, 6]]
b [10, 20, [5, 6]]
深拷贝....
a [10, 20, [5, 6]]
b [10, 20, [5, 6, 7], 30]
**
5,传递不可变参数 属于浅拷贝
**
a = (10, 20, [5, 6])
print("a", a, id(a))
def test1(m):
print("m", m, id(m))
m[2][0] = 888
print("m", m, id(m))
test1(a)
print("a", a, id(a))
运行结果如下:
a (10, 20, [5, 6]) 1994132060632
m (10, 20, [5, 6]) 1994132060632
m (10, 20, [888, 6]) 1994132060632
a (10, 20, [888, 6]) 1994132060632
**
6,深拷贝和浅拷贝的联系
**
1,二者都是将目标对象复制出一份新的来
2,想使用copy模块的话,需要先import copy
3,浅拷贝的话,copy.copy()
4,深拷贝的话,copy.deepcopy()
**
7,深拷贝和浅拷贝的区别
**
如果源对象是复合对象的话 list = [[1, 2], [3, 4]] 此列表为复合对象
浅拷贝只对源对象进行拷贝
深拷贝递归拷贝
验证结果如下:
import copy
list1 = [1, 2]
list2 = [3, 4]
list3 = [list1, list2]
list4 = copy.copy(list3)
list5 = copy.deepcopy(list3)
print(list4[0] is list3[0])
print(list5[0] is list3[0])
运行结果为:
True
False
**
以上
**
如有错误 欢迎指正
欢迎 复制 粘贴 评论 转发 点赞
**
轻轻一点 好运连连
**