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

 

相关文章

功能概要:(目前已实现功能)公共展示部分:1.网站首页展示...
大体上把Python中的数据类型分为如下几类: Number(数字) ...
开发之前第一步,就是构造整个的项目结构。这就好比作一幅画...
源码编译方式安装Apache首先下载Apache源码压缩包,地址为ht...
前面说完了此项目的创建及数据模型设计的过程。如果未看过,...
python中常用的写爬虫的库有urllib2、requests,对于大多数比...