鱼C论坛

 找回密码
 立即注册
查看: 1696|回复: 4

[已解决]第11讲内容

[复制链接]
发表于 2020-11-25 10:46:54 | 显示全部楼层 |阅读模式

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

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

x
为什么  第一段对old运用了方法后,new列表会跟着变,但是把old重新赋值后,new就不会变呢?
是因为 sort是对old进行处理,所以new会跟着变?可是重新赋值的话,并不影响new的值?


第一段:
>>> old = [1, 2, 3, 4, 5]
>>> new = old
>>> old.sort(reverse=True)
>>> old
[5, 4, 3, 2, 1]
>>> new
[5, 4, 3, 2, 1]


第二段:
>>> old = [6]
>>> old
[6]
>>> new
[5, 4, 3, 2, 1]

感谢各位大神的回答~~
最佳答案
2020-11-25 12:15:44
本帖最后由 jackz007 于 2020-11-25 12:21 编辑

       old 和 new 是标识符,[1 , 2 , 3 , 4 , 5 ] 和 [6] 是对象,Python 通过标识符来识别和处理对象,所以,为变量赋值只不过是将标识符绑定到对象。
       表达式
old = [1 , 2 , 3 , 4 , 5] 
       实现了标识符 old 和列表对象  [1 , 2 , 3 , 4 , 5] 的绑定,而语句
new = old
       则实现了 new 与 old 两个标识符共同对同一个列表对象 [1 , 2 , 3 , 4 , 5] 的绑定,这就意味着从此以后,无论通过 old 还是 new 访问到的均为同一个列表对象。
old.sort(reverse=True)
       这一句通过标识符 old 利用对象的方法对列表对象元素顺序进行了重排,重排前后,目标对象始终是同一个,只不过,对象内容发生了改变,old 、new 与对象的绑定关系并未发生改变,所以,old 和 new 呈现出的内容是完全一样的。
       后来,又执行了这一句
old = [6]
       使标识符 old 与新的列表对象 [6]  实现了绑定,从此,old 绑定了新的对象,而 new 依然绑定的是原来的对象,old 和 new "分道扬镳"。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-25 10:53:08 | 显示全部楼层
要善用论坛搜索功能
看这里,这里有大佬的详解


<font color="red">[已解决]</font>11讲和12讲拷贝问题
https://fishc.com.cn/thread-184836-1-1.html
(出处: 鱼C论坛)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-25 11:13:46 | 显示全部楼层
这个很容易理解,看我发的图,原来old指向列表对象,当old=new时,new也指向列表对象,然后你new又重新改变了指向的对象,那么old又不会改变,懂了吧!!,这就是为什么python被称为胶水性语言的其中一种原因,你这个问题很棒,多从python的c语言原理出发,你就会懂。
QQ截图20201125111001.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-25 11:24:35 | 显示全部楼层
我们可以通过id()来查看
第一段
>>> old = [1, 2, 3, 4, 5]
>>> new = old
>>> id(old)
43573192
>>> id(new)
43573192
>>> old.sort(reverse=True)
>>> old
[5, 4, 3, 2, 1]
>>> id(old)
43573192
>>> new
[5, 4, 3, 2, 1]
>>> id(new)
43573192
第二段
>>> old=[6]
>>> old
[6]
>>> id(old)
49640072
>>> new
[5, 4, 3, 2, 1]
>>> id(new)
43573192

第一段实际上old和new的id相同,好比他们都指向同一个标签
sort()方法是让这个标签发生了改变
但是old和new依旧指向这一个标签

第二段切断了old之前指向的标签,让他指向了别处
而new依旧指向原来的标签,这时候他们的id已经不同了,没有了联系
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-25 12:15:44 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2020-11-25 12:21 编辑

       old 和 new 是标识符,[1 , 2 , 3 , 4 , 5 ] 和 [6] 是对象,Python 通过标识符来识别和处理对象,所以,为变量赋值只不过是将标识符绑定到对象。
       表达式
old = [1 , 2 , 3 , 4 , 5] 
       实现了标识符 old 和列表对象  [1 , 2 , 3 , 4 , 5] 的绑定,而语句
new = old
       则实现了 new 与 old 两个标识符共同对同一个列表对象 [1 , 2 , 3 , 4 , 5] 的绑定,这就意味着从此以后,无论通过 old 还是 new 访问到的均为同一个列表对象。
old.sort(reverse=True)
       这一句通过标识符 old 利用对象的方法对列表对象元素顺序进行了重排,重排前后,目标对象始终是同一个,只不过,对象内容发生了改变,old 、new 与对象的绑定关系并未发生改变,所以,old 和 new 呈现出的内容是完全一样的。
       后来,又执行了这一句
old = [6]
       使标识符 old 与新的列表对象 [6]  实现了绑定,从此,old 绑定了新的对象,而 new 依然绑定的是原来的对象,old 和 new "分道扬镳"。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-17 14:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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