请教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'}
为了验证这个问题,写了第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'}
个人理解。
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的解释,问题的应该就是如你所说的。相当于在函数内和函数外不同的作用域上创建了两个相同名字的变量。非常感谢。
感谢tubocurarine的解释,问题的应该就是如你所说的。相当于在函数内和函数外不同的作用域上创建了两个相同名字的变量。非常感谢。
作者: jasonjean 发布时间: 2011-01-12
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28