前言
本文通过在一段示例代码中发现的问题,来给大家详细介绍了Python中的连接符(+、+=),下面话不多说,来看详细的介绍吧。
假设有下面一段代码:
a = [1, 2, 3, 4]b = [5, 6, 7, 8, 9]c = [11, 12, 13, 14, 15, 16, 17, 18, 19, 20]for item in (a, b, c): item += [0] * (10 - len(item))print aprint bprint c
这段代码的意思是,有三个列表,需要在长度不为 10 的列表尾部填充 0,让其长度变为10。
输出如下:
[1, 2, 3, 4, 0, 0, 0, 0, 0, 0][5, 6, 7, 8, 9, 0, 0, 0, 0, 0][11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
这里没什么问题,一切正常。但是,现在变了需求,需要在长度不为 10 的列表的前面填充 0。
那么,我们尝试做如下的改动:
a = [1, 2, 3, 4]b = [5, 6, 7, 8, 9]c = [11, 12, 13, 14, 15, 16, 17, 18, 19, 20]for item in (a, b, c): item = [0] * (10 - len(item)) + itemprint aprint bprint c
直接来看一下输出:
[1, 2, 3, 4][5, 6, 7, 8, 9][11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
结果却不是我们想象的那样。如果你没有发现问题的所在,就继续往下看吧。当然,如果你已经看出了其中的端倪,那就不需要在这里浪费时间了。
按照我们固有的思维,上面的方法是可行,例如下面的实例:
>>> l = [1, 2, 3, 4, 5]>>> l = [0]*5 + l>>> l[0, 0, 0, 0, 0, 1, 2, 3, 4, 5]
这样的操作让列表如愿以偿的得到我们所期望的改变。
但是,如果我们在其中多加几个步骤呢:
>>> l = [1, 2, 3, 4, 5]>>> id(l)139935500860952>>> l = [0]*5 + l>>> l[0, 0, 0, 0, 0, 1, 2, 3, 4, 5]>>> id(l)139935500783272
到此,是不是已经看出问题所在了呢。通过 id()
方法的输出可以看到,后边的 “l” 已经不是前边的 “l” 了。
再看看下边的例子:
>>> l = [1, 2, 3, 4, 5]>>> id(l)139935500861024>>> l += [0]*5>>> l[1, 2, 3, 4, 5, 0, 0, 0, 0, 0]>>> id(l)139935500861024
当用 += 时, “l” 前后是一个。此时,我们应该明白一个事实,文章开头的例子并非莫名其妙,而是有原因的。
别着急,我们再来看看例子:
>>> t = (1, 2, 3, 4, 5)>>> id(t)139935501840656>>> t += (0,)*5>>> t(1, 2, 3, 4, 5, 0, 0, 0, 0, 0)>>> id(t)139935502151336
可以看到,当我们把列表换成元组时,结果又发生了变化。
那么我们对元组使用 + 操作呢:
>>> t = (1, 2, 3, 4, 5)>>> id(t)139935501081200>>> t = (0,)*5 + t>>> t(0, 0, 0, 0, 0, 1, 2, 3, 4, 5)>>> id(t)139935502151336
新闻热点
疑难解答