概述
不可变类型:类似 c 的值传递
如 整数、字符串、元组。如fun(a),在函数内部改变变量的值,不影响函数外部的变量可变类型:类似 c 的引用传递
如 列表,字典。如 fun(la),在函数内部改变变量的值,函数外部的变量也跟着改变
值传递
例子
定义不可变数据类型,并传入函数中
def hello2(s2):
print('2-',s2)
#执行赋值操作
s2='人生苦短,我用python'
print('3-',s2)
s='python'
print('1-',s)
hello2(s)
print('4-',s)
执行结果:
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
可知:形参 指向的内存地址,与 函数外部变量 的内存地址相同,但重新 赋值 后,形参 指向另一个内存地址
引用传递
例子
定义 可变数据类型,并传入函数中:
def hello3(l):
print('2-',l)
l.append('java')
print('3-',l)
l=['html','css']
print('1-',l)
hello3(l)
print('4-',l)
执行结果:
1- ['html', 'css']
2- ['html', 'css']
3- ['html', 'css', 'java']
4- ['html', 'css', 'java']
可知:形参 指向的内存地址,与 函数外部变量 的内存地址相同,所以通过 形参 改变 可变数据类型 的内容,函数外部变量 的内容也跟着改变
在函数内部重新赋值
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 并没有改变
