不可变对象:Number,String,Tuple,bool
可变对象:List,Set,Dict 是可以改变内部的元素
实例1(str类型):
def changestr (str):
str = "inside"
print "这是function中,值为:",str
mystr = "outside"
changestr(mystr)
print "这是函数外边,mystr
输出结果:
这是function中,值为: inside
这是函数外边,值为: outside
即 传入不可变对象字符串,在函数内对其操作不影响调用结束后字符串的值,即不发生改变。
ps: Number和Tuple结果是一样的,这三种类型只能通过重新赋值来改变对象的值 .
实例2(list类型):
def changestr (str):
str.append(3)
print "这是function中,str
mystr = [1,2]
changestr(mystr)
print "这是函数外边,mystr
结果:
这是function中,值为: [1,2,3]
这是函数外边,3]
ps:对于可变对象,在函数体中的修改,对对象本身的值发生了改变,在函数之外,该列表的内容依然发生了改变,这是事先就能猜测到的结果,因为python中的参数,传入的是变量引用的副本,它与变量指向同一个值.
实例3(list类型):
def change2(list):
list = [1,3,4]
mylist = ["aa",21]
print(mylist)
change2(mylist)
print(mylist)
输出结果:
['aa',21]
['aa',21]
可变对象在函数体中的重新赋值,没有对外部变量的值产生影响,不过仔细一想,却又在情理之中 .
ps:即变量中存储的是引用,是指向真正内容的内存地址(当然,java中的八大基本数据类型,变量名和值都是存储在堆栈中的 ),对变量重新赋值,相当于修改了变量副本存储的内存地址,而这时的变量已经和函数体外的变量不是同一个了,在函数体之外的变量,依旧存储的是原本的内存地址,其值自然没有发生改变 .
实例4(list类型):
def change2(list):
list1 =list
list1.append(34)
mylist = ["aa",21]
print mylist
change2(mylist)
print mylist
输出结果:
['aa',21,34]
实例5(list类型):
import copy
def change2(list):
list1=copy.deepcopy(list)
list1.append(34)
mylist = ["aa",21]
print mylist
change2(mylist)
print mylist
结果:
['aa',21]
实例6(bool类型):
flag不做返回值,函数外不发生改变
flag=True
def change2(list,flag):
list.append(34)
flag=False
mylist = ["aa",21]
print mylist
change2(mylist,flag)
print mylist,flag
结果:
['aa',34] True
实例7(bool类型):
flag作为返回值,返回值可用,但函数仍然不发生改变
flag=True
def change2(list,flag):
list.append(34)
flag=False
return flag
mylist = ["aa",21]
print mylist
print change2(mylist,flag
输出结果:
['aa',21]
False
['aa',34] True
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。