首先构件一个settings.py文件,里面包涵多种类型的变量,别的模块从settings.py文件,导入变量测试。
# settings file
class TestClass(object):
def __init__(self, var):
self.var = var
var_string = 'change_before'
var_int = 1
var_list = [1]
var_dict = {'a': 'a'}
var_object = TestClass('object var before')
1. 使用from . import . 方法导入变量
下面定义了改变settings模块的变量的方法
# change.py file
from settings import var_string, var_int, var_list, var_dict, var_object
def change_setting():
var_string = "change_after"
var_int = 2
var_list.append(2)
var_dict['a'] = 'b'
var_object.var = "change_after"
然后是test.py
# test file
import settings
from change import change_setting
change_setting()
print "var_string: %s" % settings.var_string
print "var_int: %s" % settings.var_int
print "var_list: %s" % settings.var_list
print "var_dict: %s" % settings.var_dict
print "var_object var: %s" % settings.var_object.var
运行结果为:
var_string: change_before
var_int: 1
var_list: [1, 2]
var_dict: {'a': 'b'}
var_object var: change_after
可以看到string和int类型的变量,其实并未被改变.
2. 使用import方法
修改change.py 文件
import settings
def change_setting():
settings.var_string = "change_after"
settings.var_int = 2
settings.var_list.append(2)
settings.var_dict['a'] = 'b'
settings.var_object.var = "change_after"
再次运行test.py, 输出结果为:
var_string: change_after
var_int: 2
var_list: [1, 2]
var_dict: {'a': 'b'}
var_object var: change_after
可以看见string和int的类型的变量,被改变了。
结论:
当有类似settings.py的文件时,作为整个项目的全局变量。导入时, 尽量使用import方法, 而不要用from import 方法。否则当动态修改settings.py的变量时,并且变量类型是不可变的。并不会使变量改变。