鱼C论坛

 找回密码
 立即注册
查看: 1023|回复: 5

[已解决]12讲python有两个小问题

[复制链接]
发表于 2020-7-17 18:40:11 | 显示全部楼层 |阅读模式

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

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

x
  • >>> old = [1, 2, 3, 4, 5]
  • >>> new = old
  • >>> old = [6]
  • >>> print(new)

[color=rgb(51, 102, 153) !important]复制代码这个为什么不是墙头草跟着变类型的呀



                               
登录/注册后可看大图

>>> list3 = [name + ':' + slogan[2:] for slogan in list1 for name in list2 if slogan[0] == name[0]]
为什么slogan从2开始呀
为什么后面if只判断第0个呀
[color=rgb(51, 102, 153) !important]

[color=rgb(51, 102, 153) !important]


最佳答案
2020-7-17 19:00:00
本帖最后由 Twilight6 于 2020-7-17 19:04 编辑

[b]

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等)都是在原列表上进行改变的,只改变本源,导致与其相关的都一起发生改变



_____________________________________________________________________________________________________________________________________
为什么slogan从2开始呀?


因为两个字符串都有编号 1.xxxx , 1.yyyy , 从图片打印结果看出来,甲鱼哥的要求是要把 name 和 slogan 两个拼接起来只保留一个字符串的效果

所以把后面那个编号如: 1. 去掉,所以切片 [2:] 是从第三个字符开始到最后一个字符

为什么后面if只判断第0个呀?


因为这里图片打印的结果是相同编号的字符串拼接在一起呀,所以这里 if 是为了将编号相同的字符串进行拼接的条件

这里的字符串索引 [0] 就是索引出字符串第一个字符进行判断是否相等,相等才执行字符串的拼接操作

给你来波总体分析之前写的,应该有助于你更加了解列表推导式的使用:

举几个例子吧(假设已经给出了列表 ls1,ls2):
temp = [x for x in ls1 ]
最简单的列表推导式:将 遍历 ls1中的元素 依次赋值给 x 加入列表中去
可以分解成:
temp = []
for x in ls1:
    temp.append(x)

temp = [x for x in ls1 if <条件>]
将遍历ls1中的元素,将符合条件的元素加的列表中
可以分解成这样:
temp = []
for x in ls1:
    if <条件>:
        temp.append(x)

temp = [x+i for x in ls1 for i in ls2 if <条件>]
将 x 遍历 ls1 中的元素,然后 i 遍历 ls2 的元素 将符合条件后的 x+i 的结果依次加入列表中
可以分解成这样:
temp = []
for x in ls1:
    for i in ls2:
        if <条件>:
            temp.append(x+i)


list3=[name+':'+slogan[2:0] for slogan in list1 for name in list2 if slogan[0] == name[0]]
所以你的这题可以分解成这样:
list3=[]
for slogan in list1:
        for name in list2:
                if slogan[0]==name[0]:
                        list3.append(name + ':'+ slogan[2:])

这里的 slogan[2:] 就是把从第二个位置参数的字符到最后的字符留下,比如 1.耐克 ,就是把 耐克两个字符留下

只有当 slogan 的第一个字符 和 name 的第一个字符相等时候(也就是字符串开头的数字),满足题意,进行拼接



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

使用道具 举报

发表于 2020-7-17 19:00:00 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Twilight6 于 2020-7-17 19:04 编辑

[b]

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等)都是在原列表上进行改变的,只改变本源,导致与其相关的都一起发生改变



_____________________________________________________________________________________________________________________________________
为什么slogan从2开始呀?


因为两个字符串都有编号 1.xxxx , 1.yyyy , 从图片打印结果看出来,甲鱼哥的要求是要把 name 和 slogan 两个拼接起来只保留一个字符串的效果

所以把后面那个编号如: 1. 去掉,所以切片 [2:] 是从第三个字符开始到最后一个字符

为什么后面if只判断第0个呀?


因为这里图片打印的结果是相同编号的字符串拼接在一起呀,所以这里 if 是为了将编号相同的字符串进行拼接的条件

这里的字符串索引 [0] 就是索引出字符串第一个字符进行判断是否相等,相等才执行字符串的拼接操作

给你来波总体分析之前写的,应该有助于你更加了解列表推导式的使用:

举几个例子吧(假设已经给出了列表 ls1,ls2):
temp = [x for x in ls1 ]
最简单的列表推导式:将 遍历 ls1中的元素 依次赋值给 x 加入列表中去
可以分解成:
temp = []
for x in ls1:
    temp.append(x)

temp = [x for x in ls1 if <条件>]
将遍历ls1中的元素,将符合条件的元素加的列表中
可以分解成这样:
temp = []
for x in ls1:
    if <条件>:
        temp.append(x)

temp = [x+i for x in ls1 for i in ls2 if <条件>]
将 x 遍历 ls1 中的元素,然后 i 遍历 ls2 的元素 将符合条件后的 x+i 的结果依次加入列表中
可以分解成这样:
temp = []
for x in ls1:
    for i in ls2:
        if <条件>:
            temp.append(x+i)


list3=[name+':'+slogan[2:0] for slogan in list1 for name in list2 if slogan[0] == name[0]]
所以你的这题可以分解成这样:
list3=[]
for slogan in list1:
        for name in list2:
                if slogan[0]==name[0]:
                        list3.append(name + ':'+ slogan[2:])

这里的 slogan[2:] 就是把从第二个位置参数的字符到最后的字符留下,比如 1.耐克 ,就是把 耐克两个字符留下

只有当 slogan 的第一个字符 和 name 的第一个字符相等时候(也就是字符串开头的数字),满足题意,进行拼接



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

使用道具 举报

发表于 2020-7-17 19:02:04 | 显示全部楼层
1. old = [6] 这一句相当于将 old 赋值给另外一个列表,此时的 old 和 new 已经 “分道扬镳”,毫无关系了

2. 请见:https://fishc.com.cn/forum.php?mod=viewthread&tid=171354
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-7-17 19:11:45 | 显示全部楼层
zltzlt 发表于 2020-7-17 19:02
1. old = [6] 这一句相当于将 old 赋值给另外一个列表,此时的 old 和 new 已经 “分道扬镳”,毫无关系了
...

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

使用道具 举报

发表于 2020-7-17 19:12:10 | 显示全部楼层
1904486494 发表于 2020-7-17 19:11
明白了,谢谢你啦

如果你的问题已解决,请设置【最佳答案】
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-17 19:13:57 | 显示全部楼层

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-19 23:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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