标签: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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。