鱼C论坛

 找回密码
 立即注册
查看: 873|回复: 9

[已解决]新手求助

[复制链接]
发表于 2020-6-9 15:46:02 | 显示全部楼层 |阅读模式

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

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

x
1.    >>> old = [1, 2, 3, 4, 5]
2.    >>> new = old
3.    >>> old = [6]
4.    >>> print(new)
得出的结果是 [1,2,3,4,5]
但是


a=[0,1,2,3,4,5b=ac=a.copy()del a[1  '''   各变量值为:   a=[0, 2, 3, 4, 5]   b=[0, 2, 3, 4, 5]   c=[0, 1, 2, 3, 4, 5]'''b.remove(4)'''   各变量值为:   a=[0, 2, 3, 5]   b=[0, 2, 3, 5]   c=[0, 1, 2, 3, 4, 5]感觉这个时候和上一例子一样,a不会变,只有b变
最佳答案
2020-6-9 15:47:32
本帖最后由 Twilight6 于 2020-6-9 15:51 编辑

old = [1, 2, 3, 4, 5]   #第一次赋值
new = old    #将old 赋值给new   这行代码就等价与  new = [1,2,3,4,5]
old = [6]     #这里你的old重新赋值,就会覆盖原本的old 变量,但是new 来源还是[1,2,3,4,5]
print(new)

你可以这样做
old =  [1,2,3,4,5]
new = old          #他们的根本来源都是[1,2,3,4,5] 
new.append(6)

print(old)

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

同理:
old =  [1,2,3,4,5]
new = old          #他们的根本来源都是[1,2,3,4,5] 
old.append(6)
print(new)

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

python中 变量都有id (通俗说就是来源,id(new)可以查询new的id)

id相同 他们就相当于捆绑在一起了   其中一个改变 另一个也会随之改变  就像   量子纠缠  

而你后面是 old = [6]  是重新给old 赋值 python 就会重新赋予他一个id    就和先前的id 不同 new id 还是原来的old = [1,2,3,4,5] 时候的id

而 copy 也就是浅拷贝,相当于只拷贝列表本身,但是内部的可变元素并没有与之拷贝成新的

同理 列表的大部分方法(如 romove、pop、insert、append、sort等)都是在原列表上进行改变的,只改变本源,导致与其相关的都一起发生改变

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

使用道具 举报

发表于 2020-6-9 15:46:41 | 显示全部楼层
你的排版有点怪...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-9 15:47:32 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Twilight6 于 2020-6-9 15:51 编辑

old = [1, 2, 3, 4, 5]   #第一次赋值
new = old    #将old 赋值给new   这行代码就等价与  new = [1,2,3,4,5]
old = [6]     #这里你的old重新赋值,就会覆盖原本的old 变量,但是new 来源还是[1,2,3,4,5]
print(new)

你可以这样做
old =  [1,2,3,4,5]
new = old          #他们的根本来源都是[1,2,3,4,5] 
new.append(6)

print(old)

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

同理:
old =  [1,2,3,4,5]
new = old          #他们的根本来源都是[1,2,3,4,5] 
old.append(6)
print(new)

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

python中 变量都有id (通俗说就是来源,id(new)可以查询new的id)

id相同 他们就相当于捆绑在一起了   其中一个改变 另一个也会随之改变  就像   量子纠缠  

而你后面是 old = [6]  是重新给old 赋值 python 就会重新赋予他一个id    就和先前的id 不同 new id 还是原来的old = [1,2,3,4,5] 时候的id

而 copy 也就是浅拷贝,相当于只拷贝列表本身,但是内部的可变元素并没有与之拷贝成新的

同理 列表的大部分方法(如 romove、pop、insert、append、sort等)都是在原列表上进行改变的,只改变本源,导致与其相关的都一起发生改变

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

使用道具 举报

 楼主| 发表于 2020-6-9 15:50:08 | 显示全部楼层
第二段是
a=[0,1,2,3,4,5]
b=a
c=a.copy()
del a[1]
b.remove(4)
变量值为:   
a=[0, 2, 3, 5]   
b=[0, 2, 3, 5]   
c=[0, 1, 2, 3, 4, 5]
感觉这个时候应该和上一例子一样,a不会变,只有b变
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-9 15:54:15 | 显示全部楼层
Future博弈 发表于 2020-6-9 15:50
第二段是
a=[0,1,2,3,4,5]
b=a

你a和b指向的始终都是一个地址,所以操作a和操作b都是对一个地址进行操作的。

c浅拷贝了a一份,内存地址不同了,所以c没啥变化。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-9 15:55:22 | 显示全部楼层
Future博弈 发表于 2020-6-9 15:50
第二段是
a=[0,1,2,3,4,5]
b=a

copy() 方法只拷贝列表,会生成新的 id 地址,你可以理解下3l,相当于列表切片方法[:]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-9 15:57:55 | 显示全部楼层
Future博弈 发表于 2020-6-9 15:50
第二段是
a=[0,1,2,3,4,5]
b=a

copy不可变元素时候,你可以当作是把整个重新赋值给了变量  举个例子:
a=[0,1,2,3,4,5]  # 这里面都是整型,是不可变元素
c=a.copy()  # 这就相当于 c = [0,1,2,3,4,5] ,和 a 不关联,前提是里面都是不可变元素
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-9 15:58:20 | 显示全部楼层

嗯嗯 好的 我看懂了 = 就会重新给予一个id  
感谢感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-9 15:58:56 | 显示全部楼层
Future博弈 发表于 2020-6-9 15:58
嗯嗯 好的 我看懂了 = 就会重新给予一个id  
感谢感谢

哈哈 好聪明!~理解的好快
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-18 20:51:27 | 显示全部楼层
还有这 还有这 哈哈哈 ~~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-20 13:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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