鱼C论坛

 找回密码
 立即注册
查看: 1104|回复: 10

[已解决]零基础的第12讲的课后习题

[复制链接]
发表于 2020-5-13 23:06:35 | 显示全部楼层 |阅读模式

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

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

x
>>> old = [1, 2, 3, 4, 5]

>>> new = old

>>> old = [6]

>>> print(new)
这个为什么打印的是[1,2,3,4,5]??
不是相当于new的指针指向old么  不应该是[6]么?
为什么old排序的话  new会跟着变   重新赋值就不会变?
最佳答案
2020-5-13 23:20:50
本帖最后由 Twilight6 于 2020-5-14 09:24 编辑


这个就有关id的问题了,python中每个变量都有id地址
你可以调用 id(变量名) 就可查询该变量的id地址 ,同个id地址的源头相同
只要id源头本身一发生改变,关联这个ip的所有变量都会随之改变
前提是同id
old = [1, 2, 3, 4, 5]
new = old
你这里old  和 new 在这之前 id 地址都是相同的
但是到这时候:
old = [6]
是把一个[6]重新赋值给了old  而不是在他本身的列表上进行改变
就相当于old = [6]  覆盖了你之前的 old = [1,2,3,4,5] 而且id地址变了
所以后来的new 和 old 没有关系了 new 还是 原本的id ,只是old 被你重新赋予了一个值,等于更换了一个id地址
所以 打印 new 结果还是 [1,2,3,4,5]

但是为什么sort()排序可以一起改变呢?就是因为sort方法是在列表的本身上进行改变,id地址并不发生变化
所以当你使用sort 时候两者是关联的,一起发生改变
相同的还有remove()、append()、pop()等这些都是在列表本身上发生改变,并不会改变id地址

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-13 23:11:49 | 显示全部楼层
只有在用列表的内置方法时才会出现你说的情况
你这样操作的话就相当于新建一个叫 old 同名列表
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-13 23:20:50 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Twilight6 于 2020-5-14 09:24 编辑


这个就有关id的问题了,python中每个变量都有id地址
你可以调用 id(变量名) 就可查询该变量的id地址 ,同个id地址的源头相同
只要id源头本身一发生改变,关联这个ip的所有变量都会随之改变
前提是同id
old = [1, 2, 3, 4, 5]
new = old
你这里old  和 new 在这之前 id 地址都是相同的
但是到这时候:
old = [6]
是把一个[6]重新赋值给了old  而不是在他本身的列表上进行改变
就相当于old = [6]  覆盖了你之前的 old = [1,2,3,4,5] 而且id地址变了
所以后来的new 和 old 没有关系了 new 还是 原本的id ,只是old 被你重新赋予了一个值,等于更换了一个id地址
所以 打印 new 结果还是 [1,2,3,4,5]

但是为什么sort()排序可以一起改变呢?就是因为sort方法是在列表的本身上进行改变,id地址并不发生变化
所以当你使用sort 时候两者是关联的,一起发生改变
相同的还有remove()、append()、pop()等这些都是在列表本身上发生改变,并不会改变id地址

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-13 23:33:52 | 显示全部楼层
Twilight6 发表于 2020-5-13 23:20
这个就有关id的问题了,python中每个变量都有id地址
你可以调用 id(变量名) 就可查询该变量的id地址  ...

所以我可以理解为old=[6]和原来的old列表没有任何关系,只是同名  在内存上地址是不一样的 所以不影响new  是么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-13 23:34:25 | 显示全部楼层
liuzhengyuan 发表于 2020-5-13 23:11
只有在用列表的内置方法时才会出现你说的情况
你这样操作的话就相当于新建一个叫 old 同名列表

言简意赅  多谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-13 23:43:13 | 显示全部楼层
本帖最后由 Twilight6 于 2020-5-14 09:11 编辑
lsc顺 发表于 2020-5-13 23:33
所以我可以理解为old=[6]和原来的old列表没有任何关系,只是同名  在内存上地址是不一样的 所以不影响new ...


对哒~~~ 不同名噢  直接把原本的覆盖了,而且id地址也改变了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-13 23:46:44 | 显示全部楼层
2.jpg
python中变量名是标签,你将变量名重新赋值,意味着将这个标签从原来的地址上撕下来贴到新的地址上去了
可以看看我写的帖子
python细节之2、变量名与标签 变量的赋值与修改
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-14 07:58:13 | 显示全部楼层
old = [6] 相当于将 old 指向了另外一个列表,此时 old 和 new 一点关系都没有了。

而 old.sort() 的意思是对 old 指向的列表进行原地排序,不会改变 old 指向的位置,所以 old 和 new 会一起变。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-14 09:10:25 | 显示全部楼层
Twilight6 发表于 2020-5-13 23:20
这个就有关id的问题了,python中每个变量都有id地址
你可以调用 id(变量名) 就可查询该变量的id地址  ...


兄弟豁,网络安全搞太多了,id和ip分不清了吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-14 09:10:57 | 显示全部楼层
qiuyouzhi 发表于 2020-5-14 09:10
兄弟豁,网络安全搞太多了,id和ip分不清了吗

哈哈哈哈    谢谢提醒
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-14 11:43:58 | 显示全部楼层
qiuyouzhi 发表于 2020-5-14 09:10
兄弟豁,网络安全搞太多了,id和ip分不清了吗

大佬  您是做网安的么。。我现在学得太杂了。不知道怎么继续了。。求指导。
学了数通ip  在学安全ie   数据库mysql学了点基础   linux学了点 不过一直不用都忘了  正在学Python,html和css也学了个基础。后面怎么继续。。渗透测试是先开始用kali里的工具么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-11 08:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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