微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python函数传入的参数是否改变函数参数、指针、引用

不可变对象: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]
  • 函数体传入的参数,为函数体外变量引用的副本 .
  • 函数体中改变变量指向的堆中的值,对函数外变量有效.
  • 函数体中改变变量的引用,对函数外变量无效

要想不改变原list,用copy.deepcopy()

实例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 举报,一经查实,本站将立刻删除。

相关推荐