+ -
当前位置:首页 → 问答吧 → 请教python中一个函数的问题

请教python中一个函数的问题

时间:2011-01-12

来源:互联网

比较下面三种函数的写法:为什么第1种情况下,函数调用后,storage是空的;而第2种情况下,函数调用后storage是有的?难道函数内的语句是从下到上执行的?
为了验证这个问题,写了第3种方法,结果表明函数内的语句应该还是从上到下执行的,那怎么理解第1种和第2种的区别?

1、第1种情况,函数内data={}语句写在首行
# cat funtemp.py
#!/usr/bin/python
def init(data):
        data={}
        data['first']='tom'
        data['middle']={}
        data['last']={}
storage={}
init(storage)
print storage
# ./funtemp.py
{}

2、第2种情况,函数内data={}语句写在末行
# cat funtemp.py
#!/usr/bin/python
def init(data):
        data['first']='tom'
        data['middle']={}
        data['last']={}
        data={}
storage={}
init(storage)
print storage
# ./funtemp.py
{'middle': {}, 'last': {}, 'first': 'tom'}

3、第3种情况
#!/usr/bin/python
def init(data):
        data['first']='tom'
        data['middle']={}
        data['last']={}
        data['first']='jerry'
storage={}
init(storage)
print storage
# ./funtemp.py
{'middle': {}, 'last': {}, 'first': 'jerry'}

作者: jasonjean   发布时间: 2011-01-12

清空字典应该调用字典提供的函数 clear, 例如 :

a = {};
#some codes here
a.clear();

第一句生成了一个字典对象,中间做了若干操作后,使用 a.clear() 来清空她。

而在你的函数中,将字典作为参数传给 init() , 然后首先使用 data={} ,
不是清空了传入的字典, 而是在函数局部生成一个新的名为 data 的字典,
后续的操作都是对这个局部变量执行的,而没有对外界传入的字典进行。

下面的代码可以证明这一点:

~/tmp $ cat a.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
def init(data):
    # data.clear();
    data = { }
    data['first']='tom'
    data['middle']={}
    data['last']={}
    return data

if __name__ == '__main__':
    storage={}
    tmp = init(storage)
    print "A", storage
    print "B", tmp
~/tmp $ python a.py
A {}
B {'middle': {}, 'last': {}, 'first': 'tom'}


个人理解。

作者: tubocurarine   发布时间: 2011-01-12

回复 tubocurarine


    感谢tubocurarine的解释,问题的应该就是如你所说的。相当于在函数内和函数外不同的作用域上创建了两个相同名字的变量。非常感谢。

作者: jasonjean   发布时间: 2011-01-12