鱼C论坛

 找回密码
 立即注册
查看: 2203|回复: 6

[已解决]python 基础问题

[复制链接]
发表于 2021-2-19 00:16:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
为什么在例一中,list3的值没有改变,而例二中list3的值却改变了。
list3=list1 这个语句的本质是什么? 多谢!

例一
>>> list1=[3,4,1,2]
>>> list3=list1
>>> list1=[6]
>>> list3
[3, 4, 1, 2]

例二
>>> list1=[3,4,1,2]
>>> list2=list1[:]
>>> list3=list1
>>> list1.sort()
>>> list2
[3, 4, 1, 2]
>>> list3
[1, 2, 3, 4]
最佳答案
2021-2-19 09:27:37
对于例1来说,你没搞懂python的变量名和变量的机制。你记住,变量名字(如list1 list2等)只是个‘标签’,哪里需要哪里贴。
在创建变量的时候,首先是生成一个对象(列表对象ist1=[3,4,1,2]),然后吧标签list1贴上去。好了既然是标签就可以贴多个(就像人的外号一样),于是list2=[3,4,1,2]也是将[3,4,1,2]贴上另一个标签list2的过程!!
所以list2 和  list1只是[3,4,1,2]的不同的名字,但是他还是一个人呢
>>> list1=[3,4,1,2]
>>> id(list1)
2707461824320
>>> list3=list1
>>> id(list3)
2707461824320
这时候,你list1=[6]就是将在[3, 4, 1, 2]上面的标签list1撕下来贴到了[6],自然而然的就是[3, 4, 1, 2]上面只有list3的标签,而[6]就是list1的标签了哦

对于例2,
同样是这个问题,这里最关键的地方在于list2=list1[:]不是贴标签。在使用list1[:]的时候,这个操作是复制了一个[3,4,1,2]的内容!!!所以你得到的list1[:]和list1实际上不是同一个对象,只是他们都长得一样
>>> list1=[3,4,1,2]
>>> id(list1)
2707461824320
>>> list2=list1[:]
>>> id(list2)
2707422923776
讲到这里你应该明白了。
然后就是后面的list1.sort()不会复制[3, 4, 1, 2]而是直接对其进行改变,所以就是只是改变了list1对应的这个[3,4,1,2],变成了 [1, 2, 3, 4],请注意贴在上面的标签就是list1和list3没动哦!

【总结】
1.变量名是变量(实例化的对象)的标签
2.一个对象可以贴很多标签,也可以撕下来
3.list1[:]是复制一个对象(id会变),list1.sort()是不是复制,是编辑
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-19 00:53:24 From FishC Mobile | 显示全部楼层
list指向的是id,又不是变量名。
例一中list1和list3都指向了列表,而给list重新赋值list1就指向了新的列表,而list3任然指向原列表。
例二中 list2是复制了list1的副本,单独出来指向了另一个数据一样id不一样的列表,list3和list1都指向了原列表,对list1进行排序list3当然也会跟着变化,同理对list3排序list1也会变化,因为他们都是对同一个目标进行的操作。list1和list3只是变量名不同,实际是同一个对象。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-19 08:14:19 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-19 09:27:37 | 显示全部楼层    本楼为最佳答案   
对于例1来说,你没搞懂python的变量名和变量的机制。你记住,变量名字(如list1 list2等)只是个‘标签’,哪里需要哪里贴。
在创建变量的时候,首先是生成一个对象(列表对象ist1=[3,4,1,2]),然后吧标签list1贴上去。好了既然是标签就可以贴多个(就像人的外号一样),于是list2=[3,4,1,2]也是将[3,4,1,2]贴上另一个标签list2的过程!!
所以list2 和  list1只是[3,4,1,2]的不同的名字,但是他还是一个人呢
>>> list1=[3,4,1,2]
>>> id(list1)
2707461824320
>>> list3=list1
>>> id(list3)
2707461824320
这时候,你list1=[6]就是将在[3, 4, 1, 2]上面的标签list1撕下来贴到了[6],自然而然的就是[3, 4, 1, 2]上面只有list3的标签,而[6]就是list1的标签了哦

对于例2,
同样是这个问题,这里最关键的地方在于list2=list1[:]不是贴标签。在使用list1[:]的时候,这个操作是复制了一个[3,4,1,2]的内容!!!所以你得到的list1[:]和list1实际上不是同一个对象,只是他们都长得一样
>>> list1=[3,4,1,2]
>>> id(list1)
2707461824320
>>> list2=list1[:]
>>> id(list2)
2707422923776
讲到这里你应该明白了。
然后就是后面的list1.sort()不会复制[3, 4, 1, 2]而是直接对其进行改变,所以就是只是改变了list1对应的这个[3,4,1,2],变成了 [1, 2, 3, 4],请注意贴在上面的标签就是list1和list3没动哦!

【总结】
1.变量名是变量(实例化的对象)的标签
2.一个对象可以贴很多标签,也可以撕下来
3.list1[:]是复制一个对象(id会变),list1.sort()是不是复制,是编辑
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-19 09:53:11 | 显示全部楼层
本帖最后由 Peteryo01223 于 2021-2-19 09:54 编辑

你问的,其实是个逻辑问题。本题中,你问的是,list3=list1 和 list2=list1[:]的本质区别。
前者,list3=list1,相当于 “给人拍照”。拍照以后,人的容貌变化,但照片的图像是不变的,即 list3 的值不变。
后者, list2=list1[:],相当于“给人直播”。直播的时候,人有任何变化,直播的图像都会随之改变,即 list2 随着 list1的改变而改变。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-19 10:01:01 | 显示全部楼层
例子一中:list1 和 list3 指向的“抽屉”不一样了,list3还是贴在“抽屉1”——[3,4,1,2]上,list1贴在了“抽屉2”——[6]上了。
例子二中:list1 和 list3 始终都贴在了“抽屉1”——[3,4,1,2],你对list1排序实质是在对“抽屉1”排序,所以list3指向的肯定要随着“抽屉1”来变化了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-19 21:23:24 | 显示全部楼层
感谢大家!已经学到了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 10:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表