跨模块的Python范围/命名空间

时间:2014-11-18 21:49:30

标签: python scope

我有一个与python中的作用域有关的问题。以下是代码段:

file:settings.py

#module settings
fruit = 'banana'

def set_fruit(val):
    global fruit
    print 'Setting fruit ', fruit, ' to ', val
    fruit = val

file:helper.py

#module helper
from settings import fruit

class Helper(object):
    def __init__(self):
        print 'Inside Helper fruit = ', fruit

file:controller.py

#module controller
import settings
import helper

class Controller(object):
    def __init__(self):
        settings.set_fruit('apple')
        print 'Controller: settings.fruit = ', settings.fruit

Controller()
print 'fruit = ', settings.fruit
helper.Helper()

settings.py具有各种模块使用的全局设置。其中一些设置需要在控制器启动期间进行更改。我想知道为什么控制器更改的设置对其他人不可见,在本例中是辅助模块。

以下是我得到的输出:

$ python controller.py
Setting fruit  banana  to  apple
Controller: settings.fruit =  apple
fruit =  apple
Inside Helper fruit =  banana

1 个答案:

答案 0 :(得分:1)

当您执行from settings import fruit时,您在fruit模块中创建了一个与helper名称​​分开的新settings.fruit名称。它只引用了同一个对象。

然后,您的settings.set_fruit()方法重新绑定settings.fruit以将其指向新对象,但helper.fruit引用无法跟进;毕竟它是分开的。

所有这些与创建引用值的两个单独的局部变量没有什么不同:

fruit = 'banana'
another_fruit = fruit
fruit = 'apple'
print another_fruit

解决方法是做你在controller模块中所做的事情;仅在settings中引用名称作为模块上的属性。这样,您总是只使用一个引用,它是对settings模块的引用,然后在其他模块中共享。