yzk123 发表于 2021-2-19 00:16:33

python 基础问题

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

例一
>>> list1=
>>> list3=list1
>>> list1=
>>> list3


例二
>>> list1=
>>> list2=list1[:]
>>> list3=list1
>>> list1.sort()
>>> list2

>>> list3

qq1151985918 发表于 2021-2-19 00:53:24

list指向的是id,又不是变量名。
例一中list1和list3都指向了列表,而给list重新赋值list1就指向了新的列表,而list3任然指向原列表。
例二中 list2是复制了list1的副本,单独出来指向了另一个数据一样id不一样的列表,list3和list1都指向了原列表,对list1进行排序list3当然也会跟着变化,同理对list3排序list1也会变化,因为他们都是对同一个目标进行的操作。list1和list3只是变量名不同,实际是同一个对象。

逃兵 发表于 2021-2-19 08:14:19

https://fishc.com.cn/forum.php?mod=viewthread&tid=95265&highlight=list3%3Dlist1

Python初学者8号 发表于 2021-2-19 09:27:37

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

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

【总结】
1.变量名是变量(实例化的对象)的标签
2.一个对象可以贴很多标签,也可以撕下来
3.list1[:]是复制一个对象(id会变),list1.sort()是不是复制,是编辑

Peteryo01223 发表于 2021-2-19 09:53:11

本帖最后由 Peteryo01223 于 2021-2-19 09:54 编辑

你问的,其实是个逻辑问题。本题中,你问的是,list3=list1 和 list2=list1[:]的本质区别。
前者,list3=list1,相当于 “给人拍照”。拍照以后,人的容貌变化,但照片的图像是不变的,即 list3 的值不变。
后者, list2=list1[:],相当于“给人直播”。直播的时候,人有任何变化,直播的图像都会随之改变,即 list2 随着 list1的改变而改变。

crisfo 发表于 2021-2-19 10:01:01

例子一中:list1 和 list3 指向的“抽屉”不一样了,list3还是贴在“抽屉1”——上,list1贴在了“抽屉2”——上了。
例子二中:list1 和 list3 始终都贴在了“抽屉1”——,你对list1排序实质是在对“抽屉1”排序,所以list3指向的肯定要随着“抽屉1”来变化了。

yzk123 发表于 2021-2-19 21:23:24

感谢大家!已经学到了!
页: [1]
查看完整版本: python 基础问题