python函数值传递和引用传递 作者:马育民 • 2018-10-31 09:32 • 阅读:10193 # 概述 - 不可变类型:类似 c 的值传递 如 整数、字符串、元组。如fun(a),在函数内部改变变量的值,不影响函数外部的变量 - 可变类型:类似 c 的引用传递 如 列表,字典。如 fun(la),在函数内部改变变量的值,函数外部的变量也跟着改变 # 值传递 ### 例子 定义不可变数据类型,并传入函数中 ```python def hello2(s2): print('2-',s2) #执行赋值操作 s2='人生苦短,我用python' print('3-',s2) s='python' print('1-',s) hello2(s) print('4-',s) ``` 执行结果: ```python 1- python 2- python 3- 人生苦短,我用python 4- python ``` 从结果“4-python”中可知:在函数内改变形参的值,不会改变函数外变量的值 将上面的变量指向内存地址打印出来: ``` def hello2(s2): print('2-',s2,"id:",id(s)) s2='人生苦短,我用python' print('3-',s2,"id:",id(s2)) s='python' print('1-',s,"id:",id(s)) hello2(s) print('4-',s,"id:",id(s)) ``` 结果: ``` 1- python id: 53123488 2- python id: 53123488 3- 人生苦短,我用python id: 53129440 4- python id: 53123488 ``` 可知:**形参** 指向的内存地址,与 **函数外部变量** 的内存地址相同,但重新 **赋值** 后,**形参** 指向另一个内存地址 [](http://www.malaoshi.top//upload/0/0/1EF2B9BeriOY.png) # 引用传递 ### 例子 定义 **可变数据类型**,并传入函数中: ```python def hello3(l): print('2-',l) l.append('java') print('3-',l) l=['html','css'] print('1-',l) hello3(l) print('4-',l) ``` 执行结果: ```shell 1- ['html', 'css'] 2- ['html', 'css'] 3- ['html', 'css', 'java'] 4- ['html', 'css', 'java'] ``` 可知:**形参** 指向的内存地址,与 **函数外部变量** 的内存地址相同,所以通过 **形参** 改变 **可变数据类型** 的内容,**函数外部变量** 的内容也跟着改变 [](http://www.malaoshi.top//upload/0/0/1EF2B9IqeCfh.png) ### 在函数内部重新赋值 ``` def fun_list(l): print("id(l): 内1", id(l)) #关键代码:在函数内部重新赋值 l=[1,2,3] l.append("新元素") print("id(l): 内2", id(l)) l=[1,3.14,'python',True] print("id(l): 外1",id(l)) fun_list(l) print("id(l): 外2",id(l)) print(l) ``` 行为如下图:重新赋值后,**形参** ```l```指向 **新** 的内存地址,所以调用append()方法时,改变的是 **新 list** 的内容,**函数外部** 的 ```l``` 并没有改变 [](http://www.malaoshi.top//upload/0/0/1EF2B9OmetUk.png) 原文出处:http://www.malaoshi.top/show_1EF29wB54N34.html