neolee / pilot

进入编程世界的第一课
588 stars 842 forks source link

#1310问题疑问 #1393

Open yeghub opened 4 years ago

yeghub commented 4 years ago

将 #1310 中的 return lst修改为 return lst[0:] 程序运行之后,lst和lst_update的 id不会相等,但是执行的结果还是 [1],[1,1],[1,1,1,] 怎么觉得函数的局部变量在执行完之后还是没有销毁呢?

neolee commented 4 years ago

看不懂说的是什么……

yeghub commented 4 years ago

之前有位同学在issue中提了一个问题, 这个问题的序号是:#1310,问题名称是:列表、函数参数以及缺省值的问题 因为这个问题已被老师解决,关闭。直接在这个问题后面留言提问担心老师看不到,所以重新提交了新的issue 我的issue描述中#1310是个链接,点击这个链接能跳转到上述问题界面。 老师对这个问题的解释如下:

回到你的问题,你的代码中关键的是下面这个函数的写法很特殊:

def append_list(lst=[]): lst.append(1) return lst 这个函数接受一个列表作为输入参数,对这个列表执行了改变内容的操作(没有对 lst 做重新赋值),又返回了这个参数本身。>然后你把这个返回值赋给了一个全局变量:

lst_updated = append_list() 于是全局变量 lst_updated 和局部变量(参数) lst 就指向了同一个对象,而因为这个对象有全局变量在引用,它获得了全局变 量的生命周期,也就是说,不会随着函数调用结束而销毁——于是它的内容就得到了延续。

提问者在函数中添加了打印语句,将lst和update的ID打印了出来,发现他们是相等的,从而验证了老师的解释。

我现在是将上述函数中的 return lst 修改为 return lst[0:] 这样的话,程序执行之后返回的就不是这个参数,而是结果的slice 程序运行之后,lst和lst_update的 ID也不会相等,但是函数连续执行的结果还是 [1],[1,1],[1,1,1,] lst这个函数的局部变量并没有随着函数的结束而销毁呢?

neolee commented 4 years ago

这个有什么问题么?你调用了 lst.append() 就改变了输入参数的内容,和你返回啥没啥关系啊。

yeghub commented 4 years ago

我理解的是 第一次调用lst.append(),改变了输入参数的内容,因为输入参数是局部变量,函数调用完毕,这个局部变量随之销毁; 第二次再调用lst.append(),应该是一个新的局部变量,和第一次调用lst.append()的变量之间应该是没有任何关系的; 第三次依次类推。。。

实际测试并非如此,我应该是把输入参数和局部变量弄混了,把lst这个参数当做局部变量了