list1 和 list3 相等的问题

list1 和 list3 相等的问题

这节课前面老师讲了,Python对比较小的数字和比较短的字符串会做内存的优化,但是比较大的数字就会分开存储,那么后面代码中 list1 和 list3 是因为内容足够简单,所以才使用了同一块内存么?因为我觉得 list1 和 list3 毕竟是两个变量,应该分开存储吧?

正在回答

登陆购买课程后可参与讨论,去登陆

3回答

同学,你好。下边是两种不同的写法,同学可以参考一下:

例1:当list1为默认参数时,再进行初始化时,list1的值会根据append的添加而进行叠加,不再是空列表。

http://img1.sycdn.imooc.com//climg/5cfe24fb000175f605150470.jpg

例2:当类的写法是下图中时,每次执行__init__进行初始化时,每次实例化时都空列表。list1都会重新进行赋值。

http://img1.sycdn.imooc.com//climg/5cfe259b000130b604760436.jpg

cobain46 2019-06-12 16:49:14

首先, 比较短的会内存优化,使用同一块内存仅限于基本类型,也就是int , boolean, string等; list是引用类型, 不在其中, 所以是说的 "那么后面代码中 list1 和 list3 是因为内容足够简单,所以才使用了同一块内存么"这个不成立

其次, list1和list3使用同一块内存的原因是,他们传参的时候都使用了默认值l,没有传递新的list进去, 因此调用方法的时候,没有new新的list(没有开辟新的内存)使用的就是原来的list. 如果你想让list1和list3使用两个不同的list,可以自己new 2个list当做参数传进去,像list2一样  每次new对象的时候  都会开辟一个新的内存

希望可以解答你的疑问

好帮手慕美 2019-06-08 11:17:22

同学,你好。extend_list()用于向列表中添加元素,当list1调用函数后,函数中参数l的值发生变化为[10],当list3再次调用函数进行添加时即向[10]中进行添加,结果为[10,'a'],两个变量在调用函数时,参数l均为同一个列表,即内存地址是相同的

如果我的回答解决了您的疑惑,请采纳!祝学习愉快~~~~

  • 提问者 洛维西 #1
    那么如果把extend_list这个函数放到一个类里,再分别用list1和list3实例化后,就像我说的那样虽然都是l,但是分别储存在两个实例化后的变量里,就互不影响了,我理解的对吗?
    2019-06-08 15:59:06
  • 好帮手慕美 回复 提问者 洛维西 #2
    同学的理解是不对的,原理和在函数中是一样的。虽然是两个不同的实例,但是参数l的值在第一次append之后为[10],当再次调用时,l的默认值不再是空列表,而是[10]。并对该列表再进行添加。
    2019-06-10 09:53:10
  • 提问者 洛维西 回复 好帮手慕美 #3
    那么如果有一个类,每次对它创建实例的时候就都会对这个类本身造成影响么?那么在第二次创建实例的时候岂不是都要先对原来的类初始化?以前的课程中好像没有遇到过累死的情况啊,还是说以前课程中创建的类都巧妙地避免了这种情况?
    2019-06-10 15:39:45
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
1.Python零基础入门
  • 参与学习           人
  • 提交作业       2727    份
  • 解答问题       8160    个

想要进入Python Web、爬虫、人工智能等高薪领域,你需要掌握本阶段的Python基础知识,课程安排带你高效学习轻松入门,学完你也能听得懂Python工程师的行业梗。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师