ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python-传递可变/不可变对象,浅拷贝、深拷贝

2019-07-16 09:39:17  阅读:176  来源: 互联网

标签:Python 传递 对象 可变 print 拷贝 copy id


参数的传递

       本质:从实参到形参的赋值操作。参数的传递都是“引用传递”,不是“值传递”。具体分为两类:

       对“可变对象”(例如:字典、列表、集合、自定义的对象)进行“写操作”,直接作用于原对象本身

       对“不可变对象”(例如:数字、字符串、元组、布尔值、function等)进行“写操作”,实际传递还是对象的引用,由于不可变对象无法修改,在赋值的时候,系统会创建一个新的对象。即:生成一个“对象空间”,并用新的值填充这块空间

传递可变对象

#测试参数的传递
#传递可变对象

b=[10,20]
print(id(b))
print(b)
print("*"*8)
def test01(m):
    print(id(m))
    m.append(300)
    print(id(m))
test01(b) #b传给m,调完栈帧结束
print(b)

#传递不可变对象
a=100
print("a:",id(a))

def test02(n):
    print("n:",id(n))#传递进来的n是引用对象a的地址
   
n=n+300          #由于a是不可变对象,因此创建新的对象n
   
print("n:",id(n))#n已经变成新的对象
   
print(n)

test02(a)
print("a:",id(a))

 

浅拷贝和深拷贝(copy模块)

       参数传递的底层原理,使用内置函数copy(浅拷贝)、deepcopy(深拷贝)来实现

浅拷贝:不拷贝对象的内容,只是拷贝子对象的引用

深拷贝:对子对象的内存也会拷贝一份,对子对象的修改不会影响源对象

 

#测试浅拷贝、深拷贝
import copy

a = [10,20,[5,6]]
b = copy.copy(a)
print("a:",a)
print("b:",b)

b.append(30)  #浅拷贝只copy a
b[2].append(7)#修改了a的值

print("浅拷贝......")
print("a:",a)
print("b:",b)

 

 

#测试浅拷贝、深拷贝
import copy

def testDeepCopy():
    #测试深拷贝
   
a = [10, 20, [5, 6]]
    b = copy.deepcopy(a)
    print("a:", a)
    print("b:", b)

    b.append(30)  # 浅拷贝只copy a, b新增内容,不会在a中体现
   
b[2].append(7)  # 修改了a的值

   
print("浅拷贝......")
    print("a:", a)
    print("b:", b)
testDeepCopy()

 

传递不可变对象

 

#传递不可变对象时,如果发生拷贝,是浅拷贝

a=10
print("a:",id(a))

def test01(m):
    print("m:",id(m))
    m=20 #新建了对象
   
print(m)
    print("m:",id(m))
test01(a)

 

递不可变对象和不可变对象中的可变对象

 

#传递不可变对象时,不可变对象中包含的子对象是可变的,则方法内修改了这个可变对象,源对象也发生变化

a=(10,20,[5,6]) #不可变对象,元组
print("a:",id(a))

def test01(m):
    print("m:",id(m))
#    m[0]=20 #新建了对象,报错:TypeError: 'tuple' object does not support item assignment
   
m[2][0]=888 #元组中的列表是可变对象
   
print(m)
    print("m:",id(m))
test01(a)

 

标签:Python,传递,对象,可变,print,拷贝,copy,id
来源: https://blog.csdn.net/songpeiying/article/details/96032821

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有