歌词文件的快速解析和a += [1] 与 a = a + [1] 的区别

 

一、向字典中快速传入数据

在做练习的时候突然看到了一种方法,先声明一个

fdict= {}

然后

fdict[keys] = values

lrc = {}
line = ['[00:03.50', '传奇']
for j in line :       
    lrc[j[1:]]=line[-1]   #这样可以将列表line第一个字符串作为字典的key,第二个字符串作为值,
                          #传入到字典中

然后接下来继续循环这个式子就行了,结果能一个一个添加到fdict中,而不会被覆盖以前还以为会默认覆盖成新的

用这种方法,一下就把结果转成了键值对。

#例题:
#歌词按照对应时间进行打印

import time
musicLrc = """[00:03.50]传奇
[00:19.10]作词:刘兵 作曲:李健
[00:20.60]演唱:王菲
[00:26.60]
[04:40.75][02:39.90][00:36.25]只是因为在人群中多看了你一眼
[04:49.00]
[02:47.44][00:43.69]再也没能忘掉你容颜
[02:54.83][00:51.24]梦想着偶然能有一天再相见
[03:02.32][00:58.75]从此我开始孤单思念
[03:08.15][01:04.30]
[03:09.35][01:05.50]想你时你在天边
[03:16.90][01:13.13]想你时你在眼前
[03:24.42][01:20.92]想你时你在脑海
[03:31.85][01:28.44]想你时你在心田
[03:38.67][01:35.05]
[04:09.96][03:39.87][01:36.25]宁愿相信我们前世有约
[04:16.37][03:46.38][01:42.47]今生的爱情故事 不会再改变
[04:24.82][03:54.83][01:51.18]宁愿用这一生等你发现
[04:31.38][04:01.40][01:57.43]我一直在你身旁 从未走远
[04:39.55][04:09.00][02:07.85]
"""
musicLrc = musicLrc.splitlines()
print(musicLrc)
lrc = {}
for i in musicLrc:
    line=i.split(']')
    for j in line:
        if j.startswith('['):
            lrc[j[1:]]=line[-1]  #快速输入键值对,不会覆盖,会不停添加进入字典
for i in range(5):
    for j in range(60):
        for k in range(100):
            tm='%.2d:%.2d.%.2d'%(i,j,k)
            if tm in lrc.keys():
                print(lrc[tm])
            time.sleep(0.01)

 

 

 

二、为什么  a += [1] 与  a = a + [1]  结果不同

python中的一个变量给另一个变量赋值时,传的是地址,所以当a指向的值变化时,b由于获得的是指向a的一个指针,所以结果也会跟a的输出结果一样:

a = [1,2,3,4]
b = a
a += [1]   #在尾部增加一个list值
print a
print b

可以看到结果为:

[1, 2, 3, 4, 1]
[1, 2, 3, 4, 1]

 

这个没有什么问题,还是跟上面的解释一样,传的是地址,无论a怎么添加,b都是跟a地址相同的输出
再看下一个实验:


a = [1,2,3,4]
b = a
a = a + [1]   #在尾部增加一个list值
print a
print b

读者可以试着跑一下看看结果
运行的结果为:

[1,2,3,4,1]

[1,2,3,4]


这是为什么呢?

为什么  a += [1] 和  a = a + [1]  结果不同
通过查资料,我确信了以下解释:

当a = a+[1]时,系统所做的是把a + [1]的结果先放到另外一个地址c中,然后再把a指向这个c地址,所以输出a的时候,结果是可想而知的。

但是b还是指向以前a的位置,以前位置的值并没有变化,所以b才会输出这样一个令人稍感诧异的值,而+=操作,还是在原来a指向的地址上进行操作,所以b也会跟着变化。


总结:python中一个变量给另一个变量进行赋值操作(=)时,传的不是值,而是指针地址,一定要谨慎操作,避免掉坑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值