2016-12-14 88 views
0

类似的问题已经问过:的Python 3:跨模块的全局变量的可见性

hereherehere,我知道这些。

假设你有2个模块,其中一个有你想从另一个模块中读取的全局变量。有没有办法让这些模块可以访问,而无需每次都将它们作为module.variable引用?

实施例:

modulea.py:

import moduleb 
from moduleb import * 

print("A String: " + astring) 
print("Module B: " + moduleb.astring) 
afunction() 
print("A String: " + astring) 
print("Module B: " + moduleb.astring) 

moduleb.py:

astring = "dlroW olleH" 

def afunction(): 
    global astring 
    astring = "Hello World" 

输出是

A String: dlroW olleH 
Module B: dlroW olleH 
A String: dlroW olleH 
Module B: Hello World 

表明通过使用“从模块进口*“全局变量被复制而不是被引用。

在此先感谢您的帮助。

回答

1

from module import *module中的对象绑定到当前模块中的已命名变量。这不是副本,而是添加对同一对象的引用。两个模块都会看到相同的对象,直到其中一个重新绑定对象。修改可变对象不会重新绑定变量,因此可以添加到列表等操作。但重新分配变量确实会重新指定它。通常情况下,重新绑定是直截了当:

myvar = something_else 

但有时它不是那么清楚

myvar += 1 

对于不可变对象,例如intstr,这重新绑定变量,现在这两个模块有不同的价值观。

如果您想确保始终引用同一个对象,请保留该命名空间引用。