Thursday, November 12, 2009

什么是全局变量?

全局是一个范围, 这个早已经解理, 但是这个范围到底有多大?

就像我们的世界一样: 宇宙外面是什么? 全局包不包括宇宙外面?

只能说: global是相对的.
在python里, 这方面的API:
globals()
    globals() -> dictionary
    Return the dictionary containing the current scope's global variables.
locals()
Update and return a dictionary representing the current local symbol table.

存在run.py文件, 内容如下:
import a.am
a.am.foo()

这里存在四个scope区域:
1. run.py的scope
2. package a的scope
3. module am的scope
4. foo函数的scope

现在的问题是: 不同的scope中使用global声明和修改变量的值后是否会对其它scope产生影响

1. module中的function不会对引用它的scope产生影响 , 只会对module scope产生影响
在run.py文件中调用foo函数, foo函数中:
global name
name = "function set!"
结果发现module am的scope内的name变量变化. 这说明: function中的global声明和修改变量的值会影响到module的情况

2. package中的function不会对引用它的scope产生影响
在run.py中存在语句import a, 其中a/__init__.py的内容:
global name
name = '__init__.py set!'
结果在run.py中的scope没有发现. 这说明: package中的global声明和修改变量的值不会影响到引用它的scope
* 真实情况是: package中的function只是修改了__init__.py的scope. 这与(1)的情况是相同的


python中, 每个*.py都是一个module. package为组织module的一个对象, 说穿了package也为一个module, 例如:
# 主运行文件
jessinio@niolaptop /tmp/test $ cat use.py

import a.am
a.foo()
a.am.foo()
# pacakge的__init__.py文件
jessinio@niolaptop /tmp/test $ cat a/__init__.py
import pprint
def foo():
    print "package funcion"
# module文件
jessinio@niolaptop /tmp/test $ cat a/am.py
def foo():
    print "module am function"
# package这个绝对算是module!
jessinio@niolaptop /tmp/test $ python use.py
package funcion
module am function

在import入package下的module时, package这个"module" 也被import了! 这绝对叫到: 不正当捆绑型消费

每个python文件都会有下面的属性:
'__builtins__'
'__doc__'
'__file__'
'__name__'
'__package__'

package的__init__.py还会多一个属性:
'__path__'

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.