跨模块的Python作用域/命名空间
我有一个与python中的作用域相关的问题。下面是代码片段: 文件:settings.py跨模块的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
#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
解决方法是执行您在控制器
模块中所做的操作;仅将设置中的名称作为模块上的属性引用。这样,您将始终只使用一个参考,它是跨其他模块共享的设置
模块的参考。感谢您的快速回复。这就解释了。