http://blog.sysuschool.com/u/mygod/index.html
请稍候,载入中。。。
 
请稍候,载入中。。。
2019-3-23 15:20:00
博文:聊聊python与JavaScript(补充)

 

 

  写完函数小结,把资料再看了一遍,突然想明白了函数参数和返回值的引用问题,看来小结还是有好处,用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的列表有两个元素12,执行demo(a)函数时,a被增加了一个元素9。注意这里list变量是函数的局部变量,a是全局变量,传入列表[1,2],意味着lista都指向列表[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)时,xa同时指向数字100,函数执行到x=x+20,这是一个赋值,将100+20的结果赋值给了x,这时内部x不再指向100而是120了,返回结果120,这时外面的a不会改变,还是100


  写到这又有点晕,感觉拿这个数字来举例有点牵强,又有点说不清楚的感觉!

 

  总结:还是按js来理解比较好,没有引用关系的数据,不要去想什么引用问题,理解上面那个就可以了,只有有引用关系并且可以修改的数据才有引用问题。

 

  精简下:如果有一个变量,存储的是可变数据(列表、字典),把这个变量作为参数传给函数,而且函数内有对这个数据进行了修改(不包括赋值修改)时,外面的变量的数据也会改变!

mygod | 阅读全文 | 回复(0) | 引用通告 | 编辑
发表评论:
请稍候,载入中。。。
公告
请稍候,载入中。。。
时间记忆
请稍候,载入中。。。
最新日志
请稍候,载入中。。。
最新评论
请稍候,载入中。。。
最新回复
请稍候,载入中。。。
我的好友
我的相册
站点信息
请稍候,载入中。。。
生活因感动而精彩,理想在创造中放飞
Powered by Oblog.