跨模块的Python作用域/命名空间

跨模块的Python作用域/命名空间,python,scope,Python,Scope,我有一个与python中的作用域相关的问题。下面是代码片段: 文件:settings.py #module settings fruit = 'banana' def set_fruit(val): global fruit print 'Setting fruit ', fruit, ' to ', val fruit = val 文件:helper.py #module helper from settings import fruit class Helper

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

文件:settings.py

#module settings
fruit = 'banana'

def set_fruit(val):
    global fruit
    print 'Setting fruit ', fruit, ' to ', val
    fruit = val
文件:helper.py

#module helper
from settings import fruit

class Helper(object):
    def __init__(self):
        print 'Inside Helper fruit = ', fruit
文件: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

从设置导入水果的
一开始,您就在
helper
模块中创建了一个新的
fruit
名称,该名称与
settings.fruit
名称分开。它只引用同一个对象

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

所有这些都与创建两个单独的局部变量引用一个值没有区别:

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

解决方法是执行您在
控制器
模块中所做的操作;仅将
设置中的名称作为模块上的属性引用。这样,您将始终只使用一个参考,它是跨其他模块共享的
设置
模块的参考。

感谢您的快速回复。这就解释了。