一、向字典中快速传入数据
在做练习的时候突然看到了一种方法,先声明一个
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中一个变量给另一个变量进行赋值操作(=)时,传的不是值,而是指针地址,一定要谨慎操作,避免掉坑