1
bhuztez 2011-08-29 22:39:08 +08:00
是不是 print type(root), type(dirs), type(files) 就可以看类型了?
|
2
codeplay OP 这个倒是,我的意思怎么怎么突然冒出来root(字符串类型),dirs(List类型),files(List类型),python是怎么把它对应到当前根目录、子目录、文件的?
开始猜想是某种固定的全局变量,但我在python命令行中倒入os,然后敲type(root),提示root未定义 另外,怎么代码粘进去缩进没了? |
3
CoX 2011-08-29 23:15:41 +08:00
>help(os.walk)
|
4
keakon 2011-08-29 23:33:36 +08:00
@codeplay 要说明它的原理有点复杂,总的来说是这样的:os.walk()生成了一个generator对象,for循环会调用这个对象的next()方法,这个next方法返回了一个含3个元素的tuple,分别对应到root,dirs,files变量。
我的感觉是你似乎不太清楚for的这种用法,举个例子来说吧: for x, y in [(1, 2), (3, 4)]:... 它实际上是这样的缩写: for (x, y) in [(1, 2), (3, 4)]:... 于是第一次循环中,(x, y)就被带入了(1, 2),即 (x, y) = (1, 2) 而它又相当于 x = 1 y = 2 至于generator嘛,我就拿个简单的例子来说: def f(): yield 1, 2 yield 3, 4 g = f() print g.next() print g.next() print g.next() 输出结果是: (1, 2) (3, 4) Traceback (most recent call last): print g.next() StopIteration 可以看到,每次next()方法都会返回yield表达式的结果,当没有更多的yield时,就会抛出StopIteration异常。 而用在for循环里的时候,Python runtime会自动捕捉StopIteration异常,并停止当前循环: for x, y in f(): print x, y |