鱼C论坛

 找回密码
 立即注册
查看: 1183|回复: 4

[已解决]關於[第012讲:列表:一个打了激素的数组3 | 课后测试题及答案]

[复制链接]
发表于 2020-6-26 23:31:38 | 显示全部楼层 |阅读模式

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

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

x
1.
old = [1, 2, 3, 4, 5]
new = old
old.sort(reverse=True)
old=[6]
print(new)
print(old)

得到結果
[5, 4, 3, 2, 1]
[6]

問題:
雖然看了小甲魚的解釋,但還是不太懂,
為啥old.sort(reverse=True)會影響到new,
但old=[6]不會影響到new,
有人可以更詳細的解釋一下嗎?

2.
list1 = ["1.Just do it", "2.一切皆有可能", "3.讓編程改變世界", "4.Impossible is nothing"]
list2 = ["4.阿瑪迪斯", "2.李寧", "3.魚C", "1.耐克"]
list3 = [name + ':' + slogan[2:] for slogan in list1 for name in list2 if slogan[0] == name[0]]
for each in list3:
    print(each)

得到結果
1.耐克:Just do it
2.李寧:一切皆有可能
3.魚C:讓編程改變世界
4.阿瑪迪斯:Impossible is nothing

問題:
看不懂這條
list3 = [name + ':' + slogan[2:] for slogan in list1 for name in list2 if slogan[0] == name[0]]

為什麼slogan[2:]後面要加[2:]?
為什麼有這條if slogan[0] == name[0]?該條造成什麼影響?
為什麼不會是打印出以下結果?
1.耐克:1.Just do it
2.李寧:2.一切皆有可能
3.魚C:3.讓編程改變世界
4.阿瑪迪斯:4.Impossible is nothing
最佳答案
2020-6-27 02:10:52
第一个问题:
old.sort(reverse=True)会影响到old是因为该方法是操作的old变量所指向的内存里面的值。
而old=[6],此时重新给old赋值,这时的old所指向的内存已更改,你可以在old两次赋值后分别用id(old)来查看,会发现他们虽然是同一个变量名,但是内存地址不一样!之前的内存地址在你第二次赋值后,之前的内存地址失去了名字,不能再调用到它了。python有内存处理方法,会清理掉它,这个你现在先不必深究。
同理你可以试试
a=1
id(a)
a=2
id(a)
你会发现一些惊喜
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-27 02:10:52 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
第一个问题:
old.sort(reverse=True)会影响到old是因为该方法是操作的old变量所指向的内存里面的值。
而old=[6],此时重新给old赋值,这时的old所指向的内存已更改,你可以在old两次赋值后分别用id(old)来查看,会发现他们虽然是同一个变量名,但是内存地址不一样!之前的内存地址在你第二次赋值后,之前的内存地址失去了名字,不能再调用到它了。python有内存处理方法,会清理掉它,这个你现在先不必深究。
同理你可以试试
a=1
id(a)
a=2
id(a)
你会发现一些惊喜
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-27 02:20:21 From FishC Mobile | 显示全部楼层
第二个问题:
slogan[2:],为什么这样写,你得先看 for slogan in list1 for name in list2这两句的意思,明白slogan此时是指list1中的一个单独字符串。而slogan[2:]是指从该字符串第三个元素开始,所以输出时没有前面的1.

if slogan[0] == name[0]  就是判断两个字符串中的第一个元素是否相等,也就是为了两两个串中的1和1配对,2和2配对…

这句代码涉及到的知识有:条件表达式、列表切片,字符串,列表  几项内容,有时间的话可以回顾一下

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
一隻太平洋睡鯊 + 1 + 1 + 1 可惜一個貼子不能兩個最佳答案

查看全部评分

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

使用道具 举报

发表于 2020-6-27 02:21:33 From FishC Mobile | 显示全部楼层
第三个问题:大晚上的纯手打,觉得有用的话给个好评,哈哈
有理解不到的,继续问就好了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-6-27 08:55:42 | 显示全部楼层
第一个问题:


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






第二个问题


先帮你解析下整个题目吧,希望你能更了解了解列表推导式

举几个例子吧(假设已经给出了列表 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:]後面要加[2:]?


你随便拿两个元素出来就知道了,随便哪个元素假设:slogan = '1.Just do it'  那么 slogan[2:] 就等于 'Just do it'

然后拿去和 name 进行拼接,因为一行就需要一个编号就可以了,如果不去掉那么结果会变成你那样不美观滴,主要是为了美观

為什麼有這條if slogan[0] == name[0]?該條造成什麼影響?


用于循环判断 他们的 第一个字符,就是编号是否相同,只把相同的拼接在一起,所以起到的作用很大,比如  1.耐克 和 2.一切皆有可能 他们就不会拼接一起

因为字符串 '1' != '2' 而 '1.耐克'   和  '1.Just do it' 因为编号相等,所以就拼接在一起了




评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +3 收起 理由
一隻太平洋睡鯊 + 3 + 3 + 3 不巧剛給別人最佳答案,先支持再看,感謝回.

查看全部评分

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-20 07:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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