|
写完函数小结,把资料再看了一遍,突然想明白了函数参数和返回值的引用问题,看来小结还是有好处,用pycharm测试验证了,这里补充下。
我的理解:谈函数参数和返回值的引用问题有个前提,传入的参数必须是可变类型的数据,如列表、字典,即它们才有方法可以修改数据而不打破引用关系,如果是不可变类型的数据,只有赋值才能修改的话,不存在引用问题!!
验证代码如下:
def demo(list):
list.append(9)
return list
a = [1,2]
print(demo(a))
print(demo(a)) print(a)
代码中定义了一个demo的函数,参数为列表,list为函数的参数(局部变量list),函数中用列表的append方法为list添加一个元素9,然后返回列表。也就是说这个demo函数每执行一次,传入的列表就会增加一个元素9,因为用的是列表方法append,所以每执行一次函数,列表改变。
继续解释,这里将列表变量a作为参数传入函数,开始时变量a的列表有两个元素1和2,执行demo(a)函数时,a被增加了一个元素9。注意这里list变量是函数的局部变量,a是全局变量,传入列表[1,2],意味着list和a都指向列表[1,2],故列表变成[1,2,9]时,外面的a也被修改了,变成[1,2,9],当再次执行demo(a)时,a变成[1,2,9,9],用print(demo(a))和print(a)已验证。
再用不可变数据验证下:
def demo(x):
x=x+20
return x
a = 100
print(demo(a))
print(demo(a)) print(a)
函数参数x为局部变量,a为全局变量,变量a存储的是数字,执行函数demo(a)时,x和a同时指向数字100,函数执行到x=x+20,这是一个赋值,将100+20的结果赋值给了x,这时内部x不再指向100而是120了,返回结果120,这时外面的a不会改变,还是100!
写到这又有点晕,感觉拿这个数字来举例有点牵强,又有点说不清楚的感觉!
总结:还是按js来理解比较好,没有引用关系的数据,不要去想什么引用问题,理解上面那个就可以了,只有有引用关系并且可以修改的数据才有引用问题。
精简下:如果有一个变量,存储的是可变数据(列表、字典),把这个变量作为参数传给函数,而且函数内有对这个数据进行了修改(不包括赋值修改)时,外面的变量的数据也会改变! |