如何使用"来自modname import *"创建和修改全局名称?

时间:2014-10-25 01:54:15

标签: python import python-3.3

我已阅读the documentationthis comprehensive answer,但有些内容并不像我预期的那样有效。我希望from set_stuff_up import *基本上是"包括"声明来定义一些样板全局和函数,但某些东西并不像我期望的那样起作用。这是set_stuff_up.py:

public_name = None
def set_public_name():
    global public_name # makes no diff
    public_name = 'HELLO DERE'

但是以下代码:

from set_stuff_up import *
print('public_name is',public_name)
set_public_name()
print('public_name is',public_name)

产生输出:

public_name is None
public_name is None

换句话说,from set_stuff_up import *确实绑定了public_name"在本地命名空间中,用于导入语句发生的范围"但无论如何,函数set_public_name都在不同的public_name上运行,无论全局语句如何。

在这种情况下,有人可以澄清名称空间的运行方式吗?有没有办法让导入的函数对导入的公共名称进行操作?

2 个答案:

答案 0 :(得分:2)

了解Python变量是指值的名称非常重要。模块的全局变量是引用值的名称。当您使用from set_stuff_up import *时,这意味着,在此模块中使名称引用与set_stuff_up中相应名称相同的值。所以现在你有两个名字set_stuff_up.public_namemy_module.public_name,两个都引用相同的值(在这种情况下为None)。当您运行set_public_name时,您将重新分配set_stuff_up.public_name以引用新值。您的其他名称my_module.public_name不受影响。

名称不能引用其他名称,只能引用值。你在这里的情况与:

没什么不同
a = 1
b = a
a = 2

此时你不希望b等于2。分配给不会影响与。

共享相同值的任何其他名称

有关详细信息,请参阅Facts and Myths about Python Names and Values

没有办法整理代码以获得您正在寻找的确切效果。你可以用这个:

import set_stuff_up
print('public_name is', set_stuff_up.public_name)
set_stuff_up.set_public_name()
print('public_name is', set_stuff_up.public_name)

答案 1 :(得分:0)

set_public_name()全局只适用于set_stuff_up.py范围。来自set_stuff_up import * 的仅导入而不是参考。

set_stuff_up.py:

public_name = None
print('-- set_stuff_up.py "public_name" id',id(public_name)
def set_public_name():
    global public_name # makes no diff
    print('-- before set_public_name "public_name" id',id(public_name)
    public_name = 'HELLO DERE'
    print('-- after set_public_name "public_name" id',id(public_name)

尝试

from set_stuff_up import *
print('*** befor call set_public_name public_name id:',id(public_name) )
set_public_name() 
print('*** after call set_public_name public_name id:',id(public_name) )

结果

-- set_stuff_up.py "public_name" id 505816928
*** befor call set_public_name public_name id: 505816928
-- before set_stuff_up.py set_public_name "public_name" id 505816928
-- after set_stuff_up.py set_public_name "public_name" id 12543344
*** after call set_public_name public_name id: 505816928

import set_stuff_up 
print('### befor call set_public_name public_name id:',id(public_name) )
set_stuff_up.set_public_name() 
print('### after call set_public_name public_name id:',id(public_name) )

结果

-- set_stuff_up.py "public_name" id 505816928
### befor call set_stuff.set_public_name public_name id: 505816928
-- before set_stuff_up.py set_public_name "public_name" id 505816928
-- after set_stuff_up.py set_public_name "public_name" id 12543344
### after call set_stuff.set_public_name public_name id: 12543344