鱼C论坛

 找回密码
 立即注册
查看: 2841|回复: 11

[已解决]学python时遇到的一个指向问题

[复制链接]
发表于 2015-12-10 17:55:59 | 显示全部楼层 |阅读模式

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

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

x
list1 = [1,3,2]
list2 = list1
list1.sort()
这个时候list2和list1都是 [1,2,3]
list1 = [1,3,2]
list2 = list1
list1 = [4,5,6]
为什么list2没有跟着list1变啊
求指导 谢谢:dizzy:
最佳答案
2015-12-10 20:07:09
这里需要说明的python两个概念。
1.赋值:
大多是语言的赋值都是用A = 5这样的形式,但含义却大有不同。比如说C语言是先int A为A申请一个内存空间,而后将5放入这个空间中。而python则是将5放入内存空间并给它贴上A这个标签。
2.变量:
python有可变的变量和不可变的变量两种。整数,字符串为不可变的变量,列表为可变的变量,看一个变量是否可变是看改变后它的内存地址是否变了。
举个例子。
>>> a = 5
>>> b = a
>>> id(a)
1679341360
>>> id(b)
1679341360
a, b的地址是一样的,都指向1679341360

>>> a =3
>>> id(a)
1679341296
>>> id(b)
1679341360
>>> a
3
>>> b
5
a指向了新的地址,这跟你第二个程序一样。

>>> list1 = [1, 3, 2]
>>> list2 = list1
>>> id(list1)
55532680
>>> id(list2)
55532680
>>> list1.sort()
>>> id(list1)
55532680
list1排序后仍处于原来的地址,即是可变的变量,所以list1和list2一样。


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-12-10 19:10:04 From FishC Mobile | 显示全部楼层
list1 = [4,5,6]重新创建了一个新的list1对象
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-12-10 20:07:09 | 显示全部楼层    本楼为最佳答案   
这里需要说明的python两个概念。
1.赋值:
大多是语言的赋值都是用A = 5这样的形式,但含义却大有不同。比如说C语言是先int A为A申请一个内存空间,而后将5放入这个空间中。而python则是将5放入内存空间并给它贴上A这个标签。
2.变量:
python有可变的变量和不可变的变量两种。整数,字符串为不可变的变量,列表为可变的变量,看一个变量是否可变是看改变后它的内存地址是否变了。
举个例子。
>>> a = 5
>>> b = a
>>> id(a)
1679341360
>>> id(b)
1679341360
a, b的地址是一样的,都指向1679341360

>>> a =3
>>> id(a)
1679341296
>>> id(b)
1679341360
>>> a
3
>>> b
5
a指向了新的地址,这跟你第二个程序一样。

>>> list1 = [1, 3, 2]
>>> list2 = list1
>>> id(list1)
55532680
>>> id(list2)
55532680
>>> list1.sort()
>>> id(list1)
55532680
list1排序后仍处于原来的地址,即是可变的变量,所以list1和list2一样。


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2015-12-11 09:52:49 | 显示全部楼层
个人感觉,在Python中,是先有数据,再有变量名,变量名就是数据的标签,赋值语句就是给数据加上标签,a =1, a=2, 第二个赋值语句的作用是把标签(变量名)a从数值1上换到了数值2上
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-12-11 09:53:51 | 显示全部楼层
冬雪雪冬 发表于 2015-12-10 20:07
这里需要说明的python两个概念。
1.赋值:
大多是语言的赋值都是用A = 5这样的形式,但含义却大有不同。 ...

讲的很详细,到位,赞一个!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-11 10:14:51 | 显示全部楼层
冬雪雪冬 发表于 2015-12-10 20:07
这里需要说明的python两个概念。
1.赋值:
大多是语言的赋值都是用A = 5这样的形式,但含义却大有不同。 ...

谢谢哈
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-12-11 12:49:35 | 显示全部楼层
list1 = [1,3,2]
list2 = list1
list1 = [4,5,6]
list1把标签指向了[4,5,6],而list2还是指向[1,3,2]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-11 16:15:10 | 显示全部楼层
farewellpoem 发表于 2015-12-11 12:49
list1 = [1,3,2]
list2 = list1
list1 = [4,5,6]

谢谢:handshake
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-12-13 23:54:24 | 显示全部楼层
给个赞~~~~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-12-14 09:35:16 | 显示全部楼层
这个小甲鱼老师说过,你重新看看相关视频喽
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-12-14 10:52:42 | 显示全部楼层
python里面有一个思想叫一切皆为对象,这里你要把【1,2,3】当做一个对象(可以id(【1,2,3】))看看他在内存里的地址,而【4,5,6】也是一个对象。list1和list2仅仅是一个名称而已,一旦list1 = 【4,5,6】,list1的地址也就换了,而list2仍然指向【1,2, 3】的地址,所以list2不变
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-14 17:04:24 | 显示全部楼层
苦哈哈哈 发表于 2015-12-14 10:52
python里面有一个思想叫一切皆为对象,这里你要把【1,2,3】当做一个对象(可以id(【1,2,3】))看看他在内 ...

好的 明白了 谢谢 苦哈哈哈
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-18 16:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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