鱼C论坛

 找回密码
 立即注册
查看: 1584|回复: 8

[已解决]求助浅拷贝问题

[复制链接]
发表于 2021-10-28 15:10:55 From FishC Mobile | 显示全部楼层 |阅读模式

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

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

x
浅拷贝拷贝的是引用的话,如果一维列表y=x.copy(),为什么修改x[1]值,y[1]不变啊,这两的地址不是一样吗?改变其中一个,另一个怎么不变?
最佳答案
2021-10-30 18:44:42
j8787887910 发表于 2021-10-30 18:24
好吧,我试了下改变x[1]的值之后,发现x[1]的地址也变了,难怪y[1]不变,这又是为什么

地址用id  散列用hash

a = 1   b = 1
a和b地址一样是 1是可散列的遵循符号机制
再赋值其他的 b=2 地址就不一样了

a =[]   b = a
列表不可散列, 要地址一样只能赋值
再赋值b其他的 b=[]  地址就不一样了

元组比较特别 可以散列  不过无论怎么样 赋值都会改变id
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-28 17:21:06 | 显示全部楼层
  1. x = ['a', 'b', 'c']

  2. y = x.copy() # 只是拷贝 x 里面的元素
  3. z = x        # 指向 x 同一对象(意思就是指向 x 地址)

  4. x[1] = 13    # x 元素改变

  5. print(x)
  6. print(y)
  7. print(z)
复制代码
  1. ['a', 13, 'c']
  2. ['a', 'b', 'c']
  3. ['a', 13, 'c']
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-28 22:20:25 | 显示全部楼层
y=x.copy() 等价于  y=x[:],
x,y 地址虽然不同 但是成员x[1]和成员y[1]的地址是相同的。
用其他值替换x的成员 x[1] ,y的成员 y[1]不变是情理之中
如果x的成员 x[1]是列表  x[1].pop()后 y的成员y[1]列表也会变 这才是浅拷贝的意味
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-30 15:14:11 | 显示全部楼层
kogawananari 发表于 2021-10-28 22:20
y=x.copy() 等价于  y=x[:],
x,y 地址虽然不同 但是成员x[1]和成员y[1]的地址是相同的。
用其他值替换x ...

x[1]和y[1]的地址相同,为什么改变x[1],y[1]不变呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-30 15:43:28 | 显示全部楼层
j8787887910 发表于 2021-10-30 15:14
x[1]和y[1]的地址相同,为什么改变x[1],y[1]不变呢

a = b 可以让a的地址和b一样
再a = c  新的a地址必然会变成c的地址导致和b的不一样


这换成x[1] y[1]一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-30 17:41:11 | 显示全部楼层
本帖最后由 j8787887910 于 2021-10-30 17:46 编辑
kogawananari 发表于 2021-10-30 15:43
a = b 可以让a的地址和b一样
再a = c  新的a地址必然会变成c的地址导致和b的不一样


可是改变的是x[1]的值,而不是改变x[1]的地址,改变值之后的x[1]的地址不应该和y[1]的地址一样吗?如果一样的话,y[1]不也应该变吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-30 18:09:30 | 显示全部楼层
j8787887910 发表于 2021-10-30 17:41
可是改变的是x[1]的值,而不是改变x[1]的地址,改变值之后的x[1]的地址不应该和y[1]的地址一样吗?如果 ...

这是浅拷贝  改变x[1] y[1]也变了的话那就不是浅拷贝了 而是x即是y了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-30 18:24:39 | 显示全部楼层
本帖最后由 j8787887910 于 2021-10-30 18:33 编辑
kogawananari 发表于 2021-10-30 18:09
这是浅拷贝  改变x[1] y[1]也变了的话那就不是浅拷贝了 而是x即是y了


好吧,我试了下改变x[1]的值之后,发现x[1]的地址也变了,难怪y[1]不变,这又是为什么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-30 18:44:42 | 显示全部楼层    本楼为最佳答案   
j8787887910 发表于 2021-10-30 18:24
好吧,我试了下改变x[1]的值之后,发现x[1]的地址也变了,难怪y[1]不变,这又是为什么

地址用id  散列用hash

a = 1   b = 1
a和b地址一样是 1是可散列的遵循符号机制
再赋值其他的 b=2 地址就不一样了

a =[]   b = a
列表不可散列, 要地址一样只能赋值
再赋值b其他的 b=[]  地址就不一样了

元组比较特别 可以散列  不过无论怎么样 赋值都会改变id
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-7 01:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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