鱼C论坛

 找回密码
 立即注册
查看: 1083|回复: 6

[已解决]不太明白

[复制链接]
发表于 2018-1-15 23:08:28 | 显示全部楼层 |阅读模式

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

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

x
不是拷贝,是赋值,那么new不应该随着old改变而改变吗
最佳答案
2018-1-16 09:21:45
python中变量名只是标签而已,可以多个标签指向同一块内存
new=old
意味着new和old这两个标签指向了同一块内存
所以你对new和old指向的数据进行改动,比如列表的pop,sort,reverse等操作都会对两者同时产生作用,因为他们修改了内存中的数据
而你将old重新赋值,意味着old标签指向另外一块内存,从此old和new再无瓜葛

new不应该随着old 的赋值改变 而改变吗?

new不应该随着old 的赋值改变 而改变吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-1-15 23:13:06 | 显示全部楼层
不,是拷贝
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-15 23:48:44 | 显示全部楼层
你的old = [6]这个不是对old原来的集合进行操作,而是让old这个变量换了一个地址。
如果你不是直接对old 赋值而是对它进行操作,比如说是增加一个数值,或者减少一个元素,那么new就会随着它变。
换一种说法就是开始的时候new = old这句话的意思是new跟old这两个变量都指向同一个地址的数据,如果这个地址里的数据改变了,那么new跟old自然就会跟着变,但是如果你对new或者old重新赋值,就是指向另外一个地址的数据了,前边那个地址的数据就与之没有关系了。
不知道这个说法你能看明白否,god bless you。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-16 08:29:56 | 显示全部楼层
首先列表属于可变变量,即局部修改后其对应的地址仍在原处,所以:
>>> old = [1, 2, 3, 4, 5] #old指向地址1
>>> new = old #new也指向地址1
>>> old = [6] #old不是局部修改,而是整体重新赋值,这是指向地址2(PS只要是用列表内置的方法修改都可以说是局部修改)
>>> print(new) #new还指向地址1
你可以用id()来对比一下重新赋值和append, sort等操作或局部赋值old[0] = 10的地址变化。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-16 09:21:45 | 显示全部楼层    本楼为最佳答案   
python中变量名只是标签而已,可以多个标签指向同一块内存
new=old
意味着new和old这两个标签指向了同一块内存
所以你对new和old指向的数据进行改动,比如列表的pop,sort,reverse等操作都会对两者同时产生作用,因为他们修改了内存中的数据
而你将old重新赋值,意味着old标签指向另外一块内存,从此old和new再无瓜葛
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-16 10:30:08 | 显示全部楼层
我自己觉得 用数学的x,y还挺好理解的
x = 1
y = x
x = 2
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-16 11:00:27 | 显示全部楼层
sky 发表于 2018-1-16 10:30
我自己觉得 用数学的x,y还挺好理解的
x = 1
y = x

now y =x
so y=2
haha
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 02:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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