鱼C论坛

 找回密码
 立即注册
查看: 801|回复: 2

[已解决]关于列表的问题

[复制链接]
发表于 2020-3-11 11:30:32 | 显示全部楼层 |阅读模式

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

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

x
import copy               
alist=["魂淡",("a","b"),[98,99]]               
blist=alist #直接复制               
clist=copy.copy(alist)#浅拷贝               
dlist=copy.deepcopy(alist)#深拷贝                        运行结果显示区域                                             问题区
#查看列表中元素是否相同               
print("查看列表中元素是否相同")                                查看列表中元素是否相同                                                       
print("alist:%s" % alist)                                        alist:['魂淡', ('a', 'b'), [98, 99]]                                               
print("blist:%s" % blist)                                        blist:['魂淡', ('a', 'b'), [98, 99]]
print("clist:%s" % clist)                                        clist:['魂淡', ('a', 'b'), [98, 99]]
print("dlist:%s" % dlist)                                        dlist:['魂淡', ('a', 'b'), [98, 99]]
               
#比较列表               
print("比较列表")                                                     比较列表                                                                       
print("alist=blist:%s" % alist==blist)                        FALSE                                                                1、alist和blist元素、地址都一样,为alist==blist显示False?
print("alist=clist:%s" % alist==clist)                        FALSE
print("alist=dlist:%s" % alist==dlist)                        FALSE
               
#判断是否为列表1               
print("判断是否为列表1")                                        判断是否为列表1
print("alist is blist:%s" % alist is blist)                        FALSE                                                                2、alist和blist元素、地址都一样,为alist is blist显示False?
print("alist is clist:%s" % alist is clist)                        FALSE
print("alist is dlist:%s" % alist is dlist)                        FALSE
               
#查看列表地址               
print("查看列表地址")                                                查看列表地址
print("alist地址:%s" % id(alist))                                alist地址:47281352
print("blist地址:%s" % id(blist))                                blist地址:47281352
print("clist地址:%s" % id(clist))                                clist地址:47281608
print("dlist地址:%s" % id(dlist))                                dlist地址:47281992
               
#查看列表中一级元素地址               
print("查看列表中一级元素地址")                                查看列表中一级元素地址
print("alist[0]地址:%s" % id(alist[0]))                        alist[0]地址:50055280
print("blist[0]地址:%s" % id(blist[0]))                        blist[0]地址:50055280
print("clist[0]地址:%s" % id(clist[0]))                        clist[0]地址:50055280
print("dlist[0]地址:%s" % id(dlist[0]))                        dlist[0]地址:50055280
print("alist[1]地址:%s" % id(alist[1]))                        alist[1]地址:50092424
print("blist[1]地址:%s" % id(blist[1]))                        blist[1]地址:50092424
print("clist[1]地址:%s" % id(clist[1]))                        clist[1]地址:50092424
print("dlist[1]地址:%s" % id(dlist[1]))                        dlist[1]地址:50092424
print("alist[2]地址:%s" % id(alist[2]))                        alist[2]地址:47281096
print("blist[2]地址:%s" % id(blist[2]))                        blist[2]地址:47281096
print("clist[2]地址:%s" % id(clist[2]))                        clist[2]地址:47281096
print("dlist[2]地址:%s" % id(dlist[2]))                        dlist[2]地址:47282120
#查看列表中子元素地址               
print("查看列表中一级元素地址")                                查看列表中一级元素地址
print("alist[1][0]地址:%s" % id(alist[1][0]))                alist[1][0]地址:5347344
print("blist[1][0]地址:%s" % id(blist[1][0]))                blist[1][0]地址:5347344
print("clist[1][0]地址:%s" % id(clist[1][0]))                clist[1][0]地址:5347344
print("dlist[1][0]地址:%s" % id(dlist[1][0]))                dlist[1][0]地址:5347344
print("alist[1][1]地址:%s" % id(alist[1][1]))                alist[1][1]地址:5345664
print("blist[1][1]地址:%s" % id(blist[1][1]))                blist[1][1]地址:5345664
print("clist[1][1]地址:%s" % id(clist[1][1]))                clist[1][1]地址:5345664
print("dlist[1][1]地址:%s" % id(dlist[1][1]))                dlist[1][1]地址:5345664
print("alist[2][0]地址:%s" % id(alist[2][0]))                alist[2][0]地址:8791479578288
print("blist[2][0]地址:%s" % id(blist[2][0]))                blist[2][0]地址:8791479578288
print("clist[2][0]地址:%s" % id(clist[2][0]))                clist[2][0]地址:8791479578288
print("dlist[2][0]地址:%s" % id(dlist[2][0]))                dlist[2][0]地址:8791479578288
print("alist[2][1]地址:%s" % id(alist[2][1]))                alist[2][1]地址:8791479578320
print("blist[2][1]地址:%s" % id(blist[2][1]))                blist[2][1]地址:8791479578320
print("clist[2][1]地址:%s" % id(clist[2][1]))                clist[2][1]地址:8791479578320
print("dlist[2][1]地址:%s" % id(dlist[2][1]))                dlist[2][1]地址:8791479578320
#修改列表中一级元素               
print("修改列表中一级元素")               
alist.append("黑夜")                                                        修改列表中一级元素
print("alist:%s" % alist)                                        alist:['魂淡', ('a', 'b'), [98, 99], '黑夜']
print("blist:%s" % blist)                                        blist:['魂淡', ('a', 'b'), [98, 99], '黑夜']
print("clist:%s" % clist)                                        clist:['魂淡', ('a', 'b'), [98, 99]]                                        3、clist和alist一级元素地址相同,为何插入“黑夜”在clist中无显示?
print("dlist:%s" % dlist)                                        dlist:['魂淡', ('a', 'b'), [98, 99]]
               
#修改列表中二级元素               
print("修改列表中二级元素")                                 修改列表中二级元素
alist[1]=alist[1]+("c",)               
print("alist:%s" % alist)                                        alist:['魂淡', ('a', 'b', 'c'), [98, 99], '黑夜']
print("blist:%s" % blist)                                        blist:['魂淡', ('a', 'b', 'c'), [98, 99], '黑夜']
print("clist:%s" % clist)                                        clist:['魂淡', ('a', 'b'), [98, 99]]
print("dlist:%s" % dlist)                                        dlist:['魂淡', ('a', 'b'), [98, 99]]
alist[2].append(100)               
print("alist:%s" % alist)                                        alist:['魂淡', ('a', 'b', 'c'), [98, 99, 100], '黑夜']
print("blist:%s" % blist)                                        blist:['魂淡', ('a', 'b', 'c'), [98, 99, 100], '黑夜']
print("clist:%s" % clist)                                        clist:['魂淡', ('a', 'b'), [98, 99, 100]]
print("dlist:%s" % dlist)                                        dlist:['魂淡', ('a', 'b'), [98, 99]]                                   4、四个列表中二节元素地址均相同,为何插入的c只在a、blist中显示,
                                                                                                                                                                插入的100至在a、b、clist中显示?
最佳答案
2020-3-11 12:12:09
本帖最后由 flamezyy 于 2020-3-11 12:29 编辑
  1. import copy               
  2. alist=["魂淡",("a","b"),[98,99]]               
  3. blist=alist #直接复制               
  4. clist=copy.copy(alist)#浅拷贝               
  5. dlist=copy.deepcopy(alist)#深拷贝

  6. #查看列表中元素是否相同               
  7. print("查看列表中元素是否相同")                                                                                       
  8. print("alist:%s" % alist)                                                                                       
  9. print("blist:%s" % blist)                                       
  10. print("clist:%s" % clist)                                       
  11. print("dlist:%s" % dlist)

  12. #比较列表                           
  13. print("比较列表")                                  #'%'的优先度高于'=='                                                                                          
  14. print("alist=blist:%s" % (alist==blist))           #如果是('%s'alist==blist)相当于 ('%s'%alist)==blist 肯定是false                                                                     
  15. print("alist=clist:%s" % (alist==clist))                     
  16. print("alist=dlist:%s" % (alist==dlist))

  17. #判断是否为列表1
  18. print("判断是否为列表1")
  19. print("alist is blist:%s" % (alist is blist))
  20. print("alist is clist:%s" % (alist is clist))
  21. print("alist is dlist:%s" % (alist is dlist))
复制代码
  1. 查看列表中元素是否相同
  2. alist:['魂淡', ('a', 'b'), [98, 99]]
  3. blist:['魂淡', ('a', 'b'), [98, 99]]
  4. clist:['魂淡', ('a', 'b'), [98, 99]]
  5. dlist:['魂淡', ('a', 'b'), [98, 99]]
  6. 比较列表
  7. alist=blist:True
  8. alist=clist:True
  9. alist=dlist:True
  10. 判断是否为列表1
  11. alist is blist:True
  12. alist is clist:False
  13. alist is dlist:False
复制代码
  1. print(id(alist))
  2. print(id(blist))
  3. print(id(clist))
  4. print(id(dlist))
  5. 16979088
  6. 16979088
  7. 16979208
  8. 16979288
复制代码


可以看到,c和d的地址与a和b的不同,所以在a中增加元素,不会影响到c和d
alist.append("黑夜")                                                        修改列表中一级元素
print("alist:%s" % alist)                                        alist:['魂淡', ('a', 'b'), [98, 99], '黑夜']
print("blist:%s" % blist)                                        blist:['魂淡', ('a', 'b'), [98, 99], '黑夜']
print("clist:%s" % clist)                                        clist:['魂淡', ('a', 'b'), [98, 99]]                                      
print("dlist:%s" % dlist)                                        dlist:['魂淡', ('a', 'b'), [98, 99]]

地址:alist[2] ==blist[2]==clist[2]!=dlist[2]
说明在alist[2]中增加元素,只会影响到b[2]和c[2],不会影响到d
#修改列表中二级元素               
print("修改列表中二级元素")                                 修改列表中二级元素
alist[2].append(100)               
print("alist:%s" % alist)                                        alist:['魂淡', ('a', 'b', 'c'), [98, 99, 100], '黑夜']
print("blist:%s" % blist)                                        blist:['魂淡', ('a', 'b', 'c'), [98, 99, 100], '黑夜']
print("clist:%s" % clist)                                        clist:['魂淡', ('a', 'b'), [98, 99, 100]]
print("dlist:%s" % dlist)                                        dlist:['魂淡', ('a', 'b'), [98, 99]]

print("修改列表中二级元素")                                 修改列表中二级元素
alist[1]=alist[1]+("c",)               
print("alist:%s" % alist)                                        alist:['魂淡', ('a', 'b', 'c'), [98, 99], '黑夜']
print("blist:%s" % blist)                                        blist:['魂淡', ('a', 'b', 'c'), [98, 99], '黑夜']
print("clist:%s" % clist)                                        clist:['魂淡', ('a', 'b'), [98, 99]]
print("dlist:%s" % dlist)                                        dlist:['魂淡', ('a', 'b'), [98, 99]]
因为 alist[1]是一个元祖,而元组是不能修改的,所以四个列表的[1]地址相同,当去试图通过alist[1]=alist[1]+("c",)  改变元组时,相当于指向一个新的元组 ,而原本的元组不变,因此alist[1]的地址会变化,当然blist[1]也会变化,因为a和b的地址相同
  1. alist[1] = alist[1] + ('c',)
  2. print(id(alist[1]))
  3. print(id(blist[1]))
  4. print(id(clist[1]))
  5. print(id(dlist[1]))
  6. 43188136
  7. 43188136
  8. 42372592
  9. 42372592
复制代码


alist[2][1] ==blist[2][1]==clist[2][1]==dlist[2][1]
因为他们都指向元素99,当然地址是相同的

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
flamezyy + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

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

使用道具 举报

发表于 2020-3-11 12:12:09 | 显示全部楼层    本楼为最佳答案   
本帖最后由 flamezyy 于 2020-3-11 12:29 编辑
  1. import copy               
  2. alist=["魂淡",("a","b"),[98,99]]               
  3. blist=alist #直接复制               
  4. clist=copy.copy(alist)#浅拷贝               
  5. dlist=copy.deepcopy(alist)#深拷贝

  6. #查看列表中元素是否相同               
  7. print("查看列表中元素是否相同")                                                                                       
  8. print("alist:%s" % alist)                                                                                       
  9. print("blist:%s" % blist)                                       
  10. print("clist:%s" % clist)                                       
  11. print("dlist:%s" % dlist)

  12. #比较列表                           
  13. print("比较列表")                                  #'%'的优先度高于'=='                                                                                          
  14. print("alist=blist:%s" % (alist==blist))           #如果是('%s'alist==blist)相当于 ('%s'%alist)==blist 肯定是false                                                                     
  15. print("alist=clist:%s" % (alist==clist))                     
  16. print("alist=dlist:%s" % (alist==dlist))

  17. #判断是否为列表1
  18. print("判断是否为列表1")
  19. print("alist is blist:%s" % (alist is blist))
  20. print("alist is clist:%s" % (alist is clist))
  21. print("alist is dlist:%s" % (alist is dlist))
复制代码
  1. 查看列表中元素是否相同
  2. alist:['魂淡', ('a', 'b'), [98, 99]]
  3. blist:['魂淡', ('a', 'b'), [98, 99]]
  4. clist:['魂淡', ('a', 'b'), [98, 99]]
  5. dlist:['魂淡', ('a', 'b'), [98, 99]]
  6. 比较列表
  7. alist=blist:True
  8. alist=clist:True
  9. alist=dlist:True
  10. 判断是否为列表1
  11. alist is blist:True
  12. alist is clist:False
  13. alist is dlist:False
复制代码
  1. print(id(alist))
  2. print(id(blist))
  3. print(id(clist))
  4. print(id(dlist))
  5. 16979088
  6. 16979088
  7. 16979208
  8. 16979288
复制代码


可以看到,c和d的地址与a和b的不同,所以在a中增加元素,不会影响到c和d
alist.append("黑夜")                                                        修改列表中一级元素
print("alist:%s" % alist)                                        alist:['魂淡', ('a', 'b'), [98, 99], '黑夜']
print("blist:%s" % blist)                                        blist:['魂淡', ('a', 'b'), [98, 99], '黑夜']
print("clist:%s" % clist)                                        clist:['魂淡', ('a', 'b'), [98, 99]]                                      
print("dlist:%s" % dlist)                                        dlist:['魂淡', ('a', 'b'), [98, 99]]

地址:alist[2] ==blist[2]==clist[2]!=dlist[2]
说明在alist[2]中增加元素,只会影响到b[2]和c[2],不会影响到d
#修改列表中二级元素               
print("修改列表中二级元素")                                 修改列表中二级元素
alist[2].append(100)               
print("alist:%s" % alist)                                        alist:['魂淡', ('a', 'b', 'c'), [98, 99, 100], '黑夜']
print("blist:%s" % blist)                                        blist:['魂淡', ('a', 'b', 'c'), [98, 99, 100], '黑夜']
print("clist:%s" % clist)                                        clist:['魂淡', ('a', 'b'), [98, 99, 100]]
print("dlist:%s" % dlist)                                        dlist:['魂淡', ('a', 'b'), [98, 99]]

print("修改列表中二级元素")                                 修改列表中二级元素
alist[1]=alist[1]+("c",)               
print("alist:%s" % alist)                                        alist:['魂淡', ('a', 'b', 'c'), [98, 99], '黑夜']
print("blist:%s" % blist)                                        blist:['魂淡', ('a', 'b', 'c'), [98, 99], '黑夜']
print("clist:%s" % clist)                                        clist:['魂淡', ('a', 'b'), [98, 99]]
print("dlist:%s" % dlist)                                        dlist:['魂淡', ('a', 'b'), [98, 99]]
因为 alist[1]是一个元祖,而元组是不能修改的,所以四个列表的[1]地址相同,当去试图通过alist[1]=alist[1]+("c",)  改变元组时,相当于指向一个新的元组 ,而原本的元组不变,因此alist[1]的地址会变化,当然blist[1]也会变化,因为a和b的地址相同
  1. alist[1] = alist[1] + ('c',)
  2. print(id(alist[1]))
  3. print(id(blist[1]))
  4. print(id(clist[1]))
  5. print(id(dlist[1]))
  6. 43188136
  7. 43188136
  8. 42372592
  9. 42372592
复制代码


alist[2][1] ==blist[2][1]==clist[2][1]==dlist[2][1]
因为他们都指向元素99,当然地址是相同的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-11 12:26:51 | 显示全部楼层
flamezyy 发表于 2020-3-11 12:12
可以看到,c和d的地址与a和b的不同,所以在a中增加元素,不会影响到c和d
alist.append("黑夜")    ...

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-23 16:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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