鱼C论坛

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

[已解决]关于python的列表

[复制链接]
发表于 2020-8-30 21:17:27 | 显示全部楼层 |阅读模式

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

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

x
第一个程序
>>> list1 = [1, 3, 2, 9, 7, 8]
>>> list2 = list1[:]
>>> list2
[1, 3, 2, 9, 7, 8]
>>> list3 = list1
>>> list3
[1, 3, 2, 9, 7, 8]
list1.sort()
>>> list1
[1, 2, 3, 7, 8, 9]
>>> list3
[1, 2, 3, 7, 8, 9]

第二个程序
old = [1, 2, 3, 4, 5]
new = old
old = [6]
print(new)
打印结果是[1, 2, 3, 4, 5]

为什么第二个程序的new列表不随着old的变化而变化,第一个却变化了。
最佳答案
2020-8-30 21:21:29
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-8-30 21:21:29 | 显示全部楼层    本楼为最佳答案   
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-8-30 21:23:29 | 显示全部楼层

感谢! 那请问第一个的程序为什么会变呢  也是让两个列表直接相等
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-30 21:25:02 | 显示全部楼层
匆匆又夏天 发表于 2020-8-30 21:23
感谢! 那请问第一个的程序为什么会变呢  也是让两个列表直接相等




第一个直接相等,两个列表都是指着列表  [1, 3, 2, 9, 7, 8] ,只是列表 [1, 3, 2, 9, 7, 8] 有两个变量名 list1 和 list3 而已

所以此时对 list1 和 list3 其中一个进行 sort , 那么实际上都是对 [1, 3, 2, 9, 7, 8] 进行排序,所以都会改变

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

使用道具 举报

发表于 2020-8-30 21:26:14 | 显示全部楼层
第一个程序,list3随list1变化,是因为在python中变量名可以看作一个标签,只是贴在某个对象上面
list1.sort()针对list1所指向的列表排序,而list3和list1指向的是同一个列表,所以list3会变



                               
登录/注册后可看大图


第二个程序new = old这句话将old和new都指向同一个列表,
但之后old = [6]对old重新赋值,相当于只把old标签贴到[6]上,而new所指向的对象不变,所以new不变
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-30 21:31:31 | 显示全部楼层
Twilight6 发表于 2020-8-30 21:25
第一个直接相等,两个列表都是指着列表  [1, 3, 2, 9, 7, 8] ,只是列表 [1, 3, 2, 9, 7, 8] 有两 ...

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

使用道具 举报

 楼主| 发表于 2020-8-30 21:32:03 | 显示全部楼层
1q23w31 发表于 2020-8-30 21:26
第一个程序,list3随list1变化,是因为在python中变量名可以看作一个标签,只是贴在某个对象上面
list1.so ...

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-19 02:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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