鱼C论坛

 找回密码
 立即注册
查看: 2231|回复: 19

[已解决]python 的11讲的作业问题

[复制链接]
发表于 2017-3-6 21:40:53 | 显示全部楼层 |阅读模式

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

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

x
1488807454(1).jpg

按着课程说的这个逻辑我的z输出不应该为4了吗,怎么还是3,求帮个忙解释
最佳答案
2017-3-7 00:42:57
x= 3
z =x
这时候输出z = 3
x = 4
这时候打印z,z=3
我们分析一下:x =3  z =x  是不是当于x,z指向内存里的一个存放3的盒子里面,当x 再赋值给4的时候,z变量指向的内存盒子还是3那个盒子,而x指向则相当于新建了个盒子存4(也可以这样理解,代码是顺序执行的,当x=4的时候,它没有在执行z=x这一项了,z的值是不变的)

list1[:]就是拷贝list1的列表在另一个内存空间存储,所以list1 和list2 指向的存储内存是不一样的,
而list3 = list1 就相当于两个列表同时指向一个存储空间,假如你改变list1的元素(添加或删除)都是在于list3所指向的内存里修改;但如果你再给list1 在赋值,如list1 = [1,2,3],那么久相当于list1指向另外一个内存空间存储[1,2,3],这样list1 和list3所指向的内存空间就不一样,打印出来的list1 和list3就不一样喽。
不清楚请提问!
1488807370(1).jpg
1488807488(1).jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-3-6 21:41:34 | 显示全部楼层
帮忙说一下,有点菜鸟的问题可能,大家包含
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-6 21:56:19 | 显示全部楼层
本帖最后由 自然水 于 2017-3-6 22:00 编辑
赛大爷 发表于 2017-3-6 21:41
帮忙说一下,有点菜鸟的问题可能,大家包含


我虽然明白,但是可能讲不清楚:

[] 这样一个空列表也是“存在”的,你可以想象,一个列表,也类似一个变量 x,z.


你做的实验呢:
是属于赋值操作:

x = 3
z = x
所以z 当前 = 3

没问题。

x = 4
仅仅是 x 被赋值为一个 整形数值 4, 4本身不是列表,也不是变量。 就是个数值

还记得 变量 命名规则么? 不能以数字开头的。


另外发帖的时候:
代码可以用高级编辑模式,工具栏上面 <> 这个图标圈起来,不用截图。



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

使用道具 举报

发表于 2017-3-6 22:07:01 | 显示全部楼层
X = 4  这时会在内存中创建一个4
因为有别的变量指向着3, 所以3的内存并不清空。

list2 = list1[:],是在内存中放两个一样的列表,占双倍的位置
list1.sort()改变的是目前所指向的列表,是对指向的列表排序,所以不改变list2
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-3-6 23:35:50 | 显示全部楼层
又学了一招
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-7 00:42:57 | 显示全部楼层    本楼为最佳答案   
x= 3
z =x
这时候输出z = 3
x = 4
这时候打印z,z=3
我们分析一下:x =3  z =x  是不是当于x,z指向内存里的一个存放3的盒子里面,当x 再赋值给4的时候,z变量指向的内存盒子还是3那个盒子,而x指向则相当于新建了个盒子存4(也可以这样理解,代码是顺序执行的,当x=4的时候,它没有在执行z=x这一项了,z的值是不变的)

list1[:]就是拷贝list1的列表在另一个内存空间存储,所以list1 和list2 指向的存储内存是不一样的,
而list3 = list1 就相当于两个列表同时指向一个存储空间,假如你改变list1的元素(添加或删除)都是在于list3所指向的内存里修改;但如果你再给list1 在赋值,如list1 = [1,2,3],那么久相当于list1指向另外一个内存空间存储[1,2,3],这样list1 和list3所指向的内存空间就不一样,打印出来的list1 和list3就不一样喽。
不清楚请提问!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 5 反对 0

使用道具 举报

发表于 2017-3-7 08:11:45 | 显示全部楼层
z = x = 3  其实程序会直接变成 z = 3  \ x = 3
你把x = 4 不会改变z = 3
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-7 08:19:31 | 显示全部楼层
你这样子并没有改变z的值。可以将变量看做是指向对象或者其它什么的一个标识,x=3可以看做x指向了3这个数,z=x可以看做z跟x一样都指向了3,所以z=3,当x=4时表示x指向了4,但是z的指向依旧没有改变,还是指向3呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-3-7 08:59:16 | 显示全部楼层
看不懂 谢谢分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-7 15:28:05 | 显示全部楼层
六楼解释的已经比较清楚了,就是内存指向,与变量赋值重新开辟内存的问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-7 16:00:28 | 显示全部楼层
本帖最后由 ap815 于 2017-3-7 16:03 编辑

修改和重新赋值是一回事么?我也不太清楚,求大神解释
list1=[1,2,4,3]
list2=list1[:]
list3=list1
list1=[2,3,4,5]
print(list1,list2,list3)

[2, 3, 4, 5] [1, 2, 4, 3] [1, 2, 4, 3]

在这里面list2和list3都是没有改变的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-3-7 21:56:10 | 显示全部楼层
ap815 发表于 2017-3-7 16:00
修改和重新赋值是一回事么?我也不太清楚,求大神解释
list1=[1,2,4,3]
list2=list1[:]

修改和重新赋值不同的:

假设:

a = [1,2,3]

然后我们重新赋值:

a =[ 4,5,6]

实际上是a这个变量,被贴在了新的列表[4,5,6]上。 之前的[1,2,3]列表还是存在的,只是没有变量这个标签了。(当然过一段时间会被Python自动清理掉,减少内存损耗)

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

使用道具 举报

发表于 2017-3-7 21:57:24 | 显示全部楼层
ap815 发表于 2017-3-7 16:00
修改和重新赋值是一回事么?我也不太清楚,求大神解释
list1=[1,2,4,3]
list2=list1[:]

修改和重新赋值不同的:

假设:

a = [1,2,3]

然后我们重新赋值:

a =[ 4,5,6]

实际上是a这个变量,被贴在了新的列表[4,5,6]上。 之前的[1,2,3]列表还是存在的,只是没有变量这个标签了。(当然过一段时间会被Python自动清理掉,减少内存损耗)

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

使用道具 举报

发表于 2017-3-8 08:30:48 | 显示全部楼层
自然水 发表于 2017-3-7 21:56
修改和重新赋值不同的:

假设:

我也是这么觉得。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-8 10:18:00 | 显示全部楼层
第一种列表的话,list2= list[:]相当于是重新开辟了一个内存空间来存列表,
而赋值的话,x= 3就是x指向3,z =x的时候,其实只是将z也指向3了。当x变的时候,z的指向并不会变啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-9 09:47:29 | 显示全部楼层
6楼说的很清楚
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-9 11:01:59 | 显示全部楼层
ap815 发表于 2017-3-7 16:00
修改和重新赋值是一回事么?我也不太清楚,求大神解释
list1=[1,2,4,3]
list2=list1[:]

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

使用道具 举报

 楼主| 发表于 2017-3-9 11:27:12 | 显示全部楼层
ButcherRabbit 发表于 2017-3-7 00:42
x= 3
z =x
这时候输出z = 3

非常感谢!
可以这么说吗,我的问题的关键就是,那个list1.sort()是在修改存储空间,而赋值是对这个值又重新指向了一个存储空间,所以说,list1.sort()会使list3改变,而,list1=[1,2,3]不会使list3改变。

初学者,打算用python做数据,编程基础太差,请包涵!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-9 11:27:34 | 显示全部楼层
自然水 发表于 2017-3-7 21:56
修改和重新赋值不同的:

假设:

非常感谢!,说的很明确
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-9 11:28:12 | 显示全部楼层
自然水 发表于 2017-3-7 21:57
修改和重新赋值不同的:

假设:

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-18 08:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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