鱼C论坛

 找回密码
 立即注册
查看: 4688|回复: 15

数组的两个名字为什么输出不同呢?

[复制链接]
发表于 2017-3-28 19:09:04 | 显示全部楼层 |阅读模式

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

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

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

为什么new和old输出不同呢????????
屏幕快照 2017-03-28 下午7.05.25.png
屏幕快照 2017-03-28 下午7.05.25.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-3-28 19:26:45 | 显示全部楼层
new = old之后new和old指向的是一个列表
此时如果输入new[1] = 10;old也会发生相应变化。
但是old = [6]之后,old指向了一个新列表,old和new就不是指向一个列表了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-3-28 19:29:29 | 显示全部楼层
这是两个列表了。。。所以不改变。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-28 21:53:14 | 显示全部楼层
本帖最后由 自然水 于 2017-3-28 21:55 编辑

记得有一节课说过,Python的变量名就像一个标签,想贴哪贴哪。

那个代码里,实际上有2个列表。
【1,2,3,4,5】和【6】

当你输入 old =6的时候,
new 依然 “贴”在 [1,2,3,4,5]上。

所以不同啦。

参考这个
  1. >>> x =1
  2. >>> y=x
  3. >>> x= 2
  4. >>> y
  5. 1
复制代码


再赋值一次 y =x就好啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-28 23:50:44 | 显示全部楼层
内存指向问题
一开始old 指向[1,2,3,4,5]这个存放内存的地方
后来new =old  也就是说new这个标签也指向[1,2,3,4,5]这个存放它的内存上

当old =[6], 原本应该释放old所指向的[1,2,3,4,5]的这个内存,但new这个标签也指向这个内存
所以old 只能另外取一个内存存放[6]


详情看我发的帖子:
http://bbs.fishc.com/forum.php?m ... p;page=1#pid2805175
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-28 23:54:18 | 显示全部楼层
通俗点讲,old拉了A怪[1,2,3,4,5]让new也来打,然后old去打B怪[6],但是new仍然在打A.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-29 08:35:23 | 显示全部楼层
内存指向变了,原来old和new指向同一个内存,后来old指向另一个了,而new还是指向原来的内存,所以不会变
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-29 10:01:02 | 显示全部楼层
  1. >>> old=[1,2,3,4,5]
  2. >>> new=old #现在的new = [1,2,3,4,5]
  3. >>> new
  4. [1, 2, 3, 4, 5]
  5. >>> old=[6] #这个地方重新定义了old,old已经不再是原来的[1,2,3,4,5],而是[6]了
  6. >>> new    #虽然上一句重新定义了old,但是new的值还是[1,2,3,4,5],并没有被重新定义
  7. [1, 2, 3, 4, 5]
  8. >>> old
  9. [6]
复制代码


我给你的代码加了注释,你看看每个语句的意思
你的疑惑其实是以为new = old,所以当old的值变化的时候new也应该跟着变化对吧
其实不然,new = old这句话的意思跟数据意义的=是不一样的,这句只是把old的值复制给了new,就相当于给new了一个值,给完之后new和old就没啥关系了,打死不相往来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-29 17:17:34 | 显示全部楼层
old重新定义会覆盖之前的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-29 17:35:49 | 显示全部楼层
>>> old = [1,2,3,4,5]
>>> new = old
>>> new
[1, 2, 3, 4, 5]
>>> id(old)
51175216
>>> id(new)
51175216
>>> old= [6]
>>> id(old)
54127712
>>> id(new)
51175216
>>> new
[1, 2, 3, 4, 5]
楼主可以用id这个函数查看下,当给old重新赋值后会指向一个新的地址,而new的地址是没有变得!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-29 18:06:46 | 显示全部楼层
gopythoner 发表于 2017-3-29 10:01
我给你的代码加了注释,你看看每个语句的意思
你的疑惑其实是以为new = old,所以当old的值变化的时候 ...
  1. >>> myteacher = '小甲鱼'
  2. >>> yourteacher = myteacher
  3. >>> myteacher = '黑夜'
  4. >>> print(yourteacher)
  5. 小甲鱼
复制代码


我一直在想为什么结果不是黑夜?

听你这么一说,变量也是这个道理吧?
myteacher的值已经赋给yourteacher了,
给完之后,myteacher就和yourteacher没什么关系了,
myteacher的值变化了,yourteacher不用跟着变话了。

请问可以这么理解吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-29 19:47:13 | 显示全部楼层
陈芷韩 发表于 2017-3-29 18:06
我一直在想为什么结果不是黑夜?

听你这么一说,变量也是这个道理吧?

是的,这种关系跟数学里面的变量和因变量的关系不一样
这里只是简单的赋值而已,赋值结束就互不相干

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

使用道具 举报

发表于 2017-3-29 20:30:40 | 显示全部楼层
gopythoner 发表于 2017-3-29 19:47
是的,这种关系跟数学里面的变量和因变量的关系不一样
这里只是简单的赋值而已,赋值结束就互不相干

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

使用道具 举报

发表于 2017-3-31 17:00:23 | 显示全部楼层
gopythoner 发表于 2017-3-29 19:47
是的,这种关系跟数学里面的变量和因变量的关系不一样
这里只是简单的赋值而已,赋值结束就互不相干

你好,再请教一下列表的问题:
  1. >>> A = [1,3,2,4,5,6]
  2. >>> C = A
  3. >>> C
  4. [1, 3, 2, 4, 5, 6]
  5. >>> A.sort()
  6. >>> A
  7. [1, 2, 3, 4, 5, 6]
  8. >>> C
  9. [1, 2, 3, 4, 5, 6]
复制代码

为什么列表A变化后,列表C也跟着变了呢?

从变量赋值的角度来说,C = A ,之后A再怎么变化,只要不对C重新赋值,C就不会变化的啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-31 17:31:30 | 显示全部楼层
本帖最后由 gopythoner 于 2017-3-31 17:32 编辑
陈芷韩 发表于 2017-3-31 17:00
你好,再请教一下列表的问题:

为什么列表A变化后,列表C也跟着变了呢?


据我所知,这种情况是需要弄清楚什么是浅拷贝和深拷贝的问题
不变的:int、string、float、tuple
会变的:list、dictionary

入如果需要保持你的代码中C不变,则需要把C=A改成C=[:]
意思是复制一份A的值,这个就只是获得值而已,不然的话
  1. A = [1,3,2,4,5,6]
  2. C = A
  3. print(C)
  4. A.sort()
  5. print(A)
  6. print(C)
  7. print("------继续来探讨,发现不仅A能影响C,C也影响了A-----------")
  8. C.pop()
  9. print(A)
  10. print(C)
  11. print("--------------继续探讨,这样就不会影响了---------------------")
  12. A = [1,3,2,4,5,6]
  13. C = A[:]
  14. print(C)
  15. A.sort()
  16. print(A)
  17. print(C)
复制代码


上述输出结果
  1. [1, 3, 2, 4, 5, 6]
  2. [1, 2, 3, 4, 5, 6]
  3. [1, 2, 3, 4, 5, 6]
  4. ------继续来探讨,发现不仅A能影响C,C也影响了A-----------
  5. [1, 2, 3, 4, 5]
  6. [1, 2, 3, 4, 5]
  7. --------------分隔线---------------------
  8. [1, 3, 2, 4, 5, 6]
  9. [1, 2, 3, 4, 5, 6]
  10. [1, 3, 2, 4, 5, 6]
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-4-3 15:44:36 | 显示全部楼层
old见异思迁了,new还蒙在鼓里不知情.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-1 01:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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