文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
3.3 可变对象与不可变对象
Python的所有对象可分为可变对象 和不可变对象 (见表3-1)。所谓可变对象是指,对象的内容可变,而不可变对象是指对象内容不可变。
表3-1 可变对象与不可变对象
我们在前面已经介绍过数值类型是不可变对象,当程序尝试改变数据的值时,程序会重新生成新的数据,而不是改变原来的数据。
之所以本书要将这部分内容放到函数这一章,是因为Python函数的参数都是对象的引用。如果在引用不可变对象中尝试修改对象,程序会在函数中生成新的对象,函数外被引用的对象则不会被改变。请看下面一个函数:
def add1(num): num +=1
执行num=1,add1(num),然后再输出num的值,发现num的值还是1。这是因为主程序中的num与函数中的num是不一样的,具体一点说,它们的地址不一样,所以改变函数中的num值时并不会改变函数外的num。如果希望改变主程序的num值,可以通过返回值实现。
但如果参数是一个列表:
def add_ele(list): list.append(3) >>>L= [1,2] >>>add_ele(L)
输出L时你会发现L变成了[1,2,3],这是因为函数的参数是引用。
如果我们希望赋值时可变对象不进行引用,而是重新分配地址空间并将数据复制,我们可以利用Python的copy模块。其中主要的函数有copy.copy和copy.deepcopy。
1)copy.copy仅仅复制父对象,不会复制父对象内部的子对象。
2)copy.deepcopy复制父对象和子对象。
下面给出了一个很好的例子,如代码清单3-2所示。
代码清单3-2 深复制与浅复制
# 深复制与浅复制 import copy list1 = [1,2,['a','b']] list2 = list1 list3 = copy.copy(list1) list4 = copy.deepcopy(list1) list1.append(3) list1[2].append('c') print 'list1 = ',list1 print 'list2 = ',list2 print 'list3 = ',list3 print 'list4 = ',list4 # result: # list1 = [1, 2, ['a', 'b', 'c'], 3] # list2 = [1, 2, ['a', 'b', 'c'], 3] # list3 = [1, 2, ['a', 'b', 'c']] # list4 = [1, 2, ['a', 'b']]
*代码详见:示例程序/code/3-3.py
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论