我已阅读the documentation和this 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上运行,无论全局语句如何。
在这种情况下,有人可以澄清名称空间的运行方式吗?有没有办法让导入的函数对导入的公共名称进行操作?
答案 0 :(得分:2)
了解Python变量是指值的名称非常重要。模块的全局变量是引用值的名称。当您使用from set_stuff_up import *
时,这意味着,在此模块中使名称引用与set_stuff_up中相应名称相同的值。所以现在你有两个名字set_stuff_up.public_name
和my_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