VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • Python 程序员经常犯的 10 个错误(4)

常见错误 6: 不明白Python在闭包中是如何绑定变量的

看下面这个例子:

1
2
3
4
5
>>> def create_multipliers():  
...     return [lambda x : i * for in range(5)]  
>>> for multiplier in create_multipliers():  
...     print multiplier(2)  
...

你也许希望获得下面的输出结果:

但实际的结果却是:

8  

8  

8  

8  

8  

惊讶吧!

这之所以会发生是由于Python中的“后期绑定”行为——闭包中用到的变量只有在函数被调用的时候才会被赋值。所以,在上面的代码中,任何时候,当返回的函数被调用时,Python会在该函数被调用时的作用域中查找 i 对应的值(这时,循环已经结束,所以 i 被赋上了最终的值——4)。

解决的方法有一点hack的味道:

1
2
3
4
5
6
>>> def create_multipliers():  
...     return [lambda x, i=i : i * for in range(5)]  
...  
>>> for multiplier in create_multipliers():  
...     print multiplier(2)  
...

在这里,我们利用了默认参数来生成一个匿名的函数以便实现我们想要的结果。有人说这个方法很巧妙,有人说它难以理解,还有人讨厌这种做法。但是,如果你是一个 Python 开发者,理解这种行为很重要。

常见错误 7: 创建循环依赖模块

让我们假设你有两个文件,a.py 和 b.py,他们之间相互引用,如下所示:

a.py:

1
2
3
4
import b  
def f():  
    return b.x    
print f()

b.py:

1
2
3
4
import a  
= 1
def g():  
    print a.f()

相关教程