【问题标题】:import behavior when accessing global variables in Python在 Python 中访问全局变量时的导入行为
【发布时间】:2014-02-18 03:20:27
【问题描述】:

bar.py 中:

var = 1
def set_var():
    global var
    var = 2

foo.py 中:

from bar import *

print(var)
set_var()
print(var)

foo2.py 中:

import bar

print(bar.var)
bar.set_var()
print(bar.var)

如果我运行 foo.py 输出是:

1
1

但是如果我运行 foo2.py 输出是:

1
2

这是我所期望的。

我只想了解这种行为,因为我是 Python 新手,还没有找到很好的理由。

PD:附加信息。我想开发一个使用单例对象的模块,并且我有一些使用该对象的遗留代码。我不希望在遗留代码中为对该对象的每个引用添加前缀,这就是为什么我认为使用 from library import object 语法导入模块会有所帮助。

所以在库中,我有访问全局对象的函数来配置它,就像在示例 (bar.py) 中一样。在遗留代码中,我希望只需要像在 foo.py 中那样进行某种导入。

感谢您的指导。

已编辑:第二个示例

在 bar.py 中

var_list = list(range(0, 2))
var_list2 = list(range(0, 2))

def set_var():
    global var_list
    var_list = list(range(0, 3))
    var_list2.append(2)

在 foo.py 中

from bar import *

print(var_list)
print(var_list2)
set_var()
print(var_list)
print(var_list2) 

输出是:

[0, 1]
[0, 1]
[0, 1]
[0, 1, 2]

我知道在 set_var 中我们正在使用 list() 创建一个新对象,但我希望在 foo.py 中访问这个新对象时我提到它与 var_list 一起使用(就像使用语法 bar.var_list 一样)。我需要更多背景知识。

谢谢

【问题讨论】:

标签: python python-2.7 python-import


【解决方案1】:

bar.py 中的“var”是bar.var。总是(除非它是__main__.var,但这是一个不同的问题)。对该名称的任何操作仅发生在该模块中/该模块中,而不是在其他任何地方制作的副本,例如通过from bar import ... 完成的副本。

【讨论】:

  • 感谢您的回复,但我仍然不清楚。我通过调用 set_var 进行操作,它不会引发任何异常,它等于调用 bar.set_var()。我虽然 from bar import 会将所有导入的对象带入命名空间,而不是创建新对象...
  • @Natxo.Piq:它复制了名称,但没有重写函数。
  • 例如:如果 var 是一个列表,并且 set_var 附加了一个新元素,那么在运行 foo 时,结果会如预期的那样。因此,对于可变和非可变对象的行为方式不同。对不起,但我还是不明白。我将用另一个示例进行编辑。
  • 那是因为它们是完全不同的操作。
【解决方案2】:

这种行为有两个组成部分:

  1. 正如@Ignacio 已经解释的那样,python 中所谓的“全局变量”实际上具有模块范围的范围。

  2. python中的变量名指向一个对象(可变或不可变,类或整数,都一样)。当您分配给现有名称时,您会破坏它与之前指向的任何内容的关联。

这就是foo 所做的:

# import
foo.var = bar.var
foo.set_var = bar.set_var

print(foo.var)
foo.set_var()   # sets bar.var
print(foo.var)

foo2,当然,设置和打印bar.var

关于您的第二个示例:您可以修改列表而不破坏其与指向它的变量的关联。所以对var_list2 的更改随处可见(请注意,您永远不会分配给它)。但是由于您分配给var_list,它的行为类似于第一个示例中的var

【讨论】:

  • 感谢您的回复。另外,这个问题是重复的,但我找不到!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-02
  • 1970-01-01
  • 2012-02-26
  • 1970-01-01
相关资源
最近更新 更多