j8787887910 发表于 2021-10-28 15:10:55

求助浅拷贝问题

浅拷贝拷贝的是引用的话,如果一维列表y=x.copy(),为什么修改x[1]值,y[1]不变啊,这两的地址不是一样吗?改变其中一个,另一个怎么不变?

傻眼貓咪 发表于 2021-10-28 17:21:06

x = ['a', 'b', 'c']

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

x = 13    # x 元素改变

print(x)
print(y)
print(z)['a', 13, 'c']
['a', 'b', 'c']
['a', 13, 'c']

kogawananari 发表于 2021-10-28 22:20:25

y=x.copy() 等价于y=x[:],
x,y 地址虽然不同 但是成员x和成员y的地址是相同的。
用其他值替换x的成员 x ,y的成员 y[1]不变是情理之中
如果x的成员 x是列表x.pop()后 y的成员y列表也会变 这才是浅拷贝的意味

j8787887910 发表于 2021-10-30 15:14:11

kogawananari 发表于 2021-10-28 22:20
y=x.copy() 等价于y=x[:],
x,y 地址虽然不同 但是成员x和成员y的地址是相同的。
用其他值替换x ...

x和y的地址相同,为什么改变x,y不变呢

kogawananari 发表于 2021-10-30 15:43:28

j8787887910 发表于 2021-10-30 15:14
x和y的地址相同,为什么改变x,y不变呢

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


这换成x y一样

j8787887910 发表于 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的值,而不是改变x的地址,改变值之后的x的地址不应该和y的地址一样吗?如果一样的话,y不也应该变吗

kogawananari 发表于 2021-10-30 18:09:30

j8787887910 发表于 2021-10-30 17:41
可是改变的是x的值,而不是改变x的地址,改变值之后的x的地址不应该和y的地址一样吗?如果 ...

{:10_292:} 这是浅拷贝改变x y也变了的话那就不是浅拷贝了 而是x即是y了

j8787887910 发表于 2021-10-30 18:24:39

本帖最后由 j8787887910 于 2021-10-30 18:33 编辑

kogawananari 发表于 2021-10-30 18:09
这是浅拷贝改变x y也变了的话那就不是浅拷贝了 而是x即是y了

好吧,我试了下改变x的值之后,发现x的地址也变了,难怪y不变,这又是为什么

kogawananari 发表于 2021-10-30 18:44:42

j8787887910 发表于 2021-10-30 18:24
好吧,我试了下改变x的值之后,发现x的地址也变了,难怪y不变,这又是为什么

地址用id散列用hash

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

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

元组比较特别 可以散列不过无论怎么样 赋值都会改变id
页: [1]
查看完整版本: 求助浅拷贝问题