Python:列表也能拆包?
2019-06-13 本文已影响11人
我爱学python
前几天,看书时遇到了这样一个问题,看下图:
![](https://img.haomeiwen.com/i14733701/ed64db23f486ae55.png)
这是常用的 matplotlib 库,只是一般我们调用 plot 方法绘图时,不会去关心它的返回值。然而 plt1, = plt.plot(...) 这种写法是什么意思?被赋值的变量和赋值符号之间多了个逗号。
我的确从来没关心过 plot 函数的返回值是什么,所以当我看到这个截图的时候,第一反应是以为返回值有多个,代码只取了第一个,剩余的被忽略了。这种情况一般都是用 _ 做占位符,来忽略不关心的值。
占位符 _ 也可以省略吗?我迅速打开 PyCharm 验证了一把,事实证明,_ 不可以省略,我的想法是错了。
为了查明原因,我去查了 matplotlib 的源码,发现 plot 函数返回的是一个列表,源码如下:
![](https://img.haomeiwen.com/i13717038/cc9791f4c8deab38.png)
我这才反应过来,这是列表拆包啊。变量后面的逗号,是因为返回的列表中只有一个元素,所以拆包的时候变量后面要加个逗号,标明这是拆包,不是赋值。
代码中,我们用的比较多的是元组拆包,各种书里也多是讲元组拆包,所以忽略了列表也是可以拆包的。看下面的例子:
![](https://img.haomeiwen.com/i13717038/3a43b7cbf7c1ada4.png)
不仅是元组和列表,所有可迭代对象都可以拆包。我们可以自定义一个可迭代对象(只需要实现其协议即 __iter__ 方法即可),来验证一下,代码如下:
![](https://img.haomeiwen.com/i13717038/7573fce41fbc33da.png)