python 参数的传递 传递可变对象和不可变对象 深拷贝和浅拷贝的内存分析

**

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

**

以上

**

如有错误 欢迎指正
欢迎 复制 粘贴 评论 转发 点赞

**

轻轻一点 好运连连

**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值