python可变和不可变数据对象是什么意思_《python 与数据挖掘 》一 3.3 可变对象与不可变对象-阿里云开发者社区...

本节书摘来自华章出版社《python 与数据挖掘 》一书中的第3章,第3.3节,作者张良均 杨海宏 何子健 杨 征,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.3 可变对象与不可变对象

Python的所有对象可分为可变对象和不可变对象(见表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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值