我有一个与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
答案 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
模块的引用,然后在其他模块中共享。