python新手常犯错误

简介:

本文参考自伯乐在线:http://blog.jobbole.com/42706/

1.用可变值作为默认值

记住一点,在Python里,函数的默认值在函数定义的时候实例化的,而不是在调用的时候。

比如下面这个函数,numbers参数初始化为空列表,那么每次调用的时候都会将9加入到列表后面:

def foo(numbers=[]):
    numbers.append(9)
    print numbers
结果:

>>> foo() # first time, like before
[9]
>>> foo() # second time
[9, 9]
>>> foo() # third time...
[9, 9, 9]
>>> foo() # WHAT IS THIS BLACK MAGIC?!
[9, 9, 9, 9]

再看一个更加明显的例子:

def print_now(now=time.time()):
    print now
这个函数输出当前时间戳,这个时间戳不是每次调用时的时间戳,而是该函数定义时被解释器解释时候的时间戳!

>>> print_now()
1373121487.91
>>> print_now()
1373121487.91
>>> print_now()
1373121487.91


2作用域

尽量不要用全局变量。这可能会带来诸多麻烦。
bar = 42
def foo():
    print bar
上面这段代码的输出结果是42,因为函数内部的bar是全局变量。再看下面这段代码:
>>> bar = 42
... def foo():
...     bar = 0
... foo()
... print bar
42
foo中的bar其实是一个局部变量,你并没有改变全局变量的值。再看下面这段代码:
bar = 42
def foo():
    print bar
    bar = 0

你本来想打印全局变量bar之后再创建一个局部变量bar,但事实上,报错了!


提示局部变量bar在没有赋值前就被引用了。这是因为python是解释性语言,当解释器执行到def foo():函数声明时,会静态的从这个函数作用域获取信息。当解释到bar=0这一行时会把bar加入局部变量列表(是解释到这一行,不是执行到这一行,所以此时局部变量bar并没有被赋值),但当执行到print bar时,局部变量bar没有赋值,所以就报错了。

如果想让程序按照原先的想法执行,那么应该要加上global关键字声明。


事实上,这些错误我们有时候很清楚,但就是写的时候容易忽略这一点。尤其是在和其他语言混合编程的时候很容易混淆。



相关文章
|
9月前
|
数据可视化 索引 Python
技巧 | 99.9%的人都会犯错的几个Python小常识!
技巧 | 99.9%的人都会犯错的几个Python小常识!
技巧 | 99.9%的人都会犯错的几个Python小常识!
|
5月前
|
程序员 Python
每个新手程序员都应该知道的 Python 技巧
每个新手程序员都应该知道的 Python 技巧
|
12月前
|
数据采集 Shell Linux
Python初学者常犯错误及解决方法自查
Python初学者常犯错误及解决方法自查
138 0
|
Java 程序员 索引
Python 新手常犯的错误
Python 新手常犯的错误
50 0
|
存储 算法 Python
5个python中编程的大坑
5个python中编程的大坑
175 0
|
存储 Python
别人都在庆祝建军节我却忘记了,为了弥补我用Python教大家打军体拳吧!
想想今天不知道该写点什么,不如我们就来做一套军体拳动画,大家觉得如何!
242 0
|
Python
盘点一个Python初学者常犯的一个错误问题
盘点一个Python初学者常犯的一个错误问题
113 0
盘点一个Python初学者常犯的一个错误问题
|
存储 Python
10分钟教你用python如何正确把妹-不知道妹子为何生气?那是因为你没学python
10分钟教你用python如何正确把妹-不知道妹子为何生气?那是因为你没学python
156 0
10分钟教你用python如何正确把妹-不知道妹子为何生气?那是因为你没学python

热门文章

最新文章