【问题标题】:Using variables inside a function in another python file在另一个 python 文件的函数中使用变量
【发布时间】:2015-12-13 19:52:57
【问题描述】:

我似乎无法完成这项工作。

我有 2 个 python 文件,比如说 a.py 和 b.py

在 a.py 中是这样的:

def foo():
    global name
    name = "foo"
    import b
    b.bar()

if __name__ == "__main__":
    foo()

在 b.py 中:

import a

def bar():
    name = a.name
    print(name)

我对这段代码有三个不同的问题:

  1. 为什么会出现错误:AttributeError: 'module' object has no attribute 'name' 我确定 b.py 无法访问 b.py 函数中定义的变量,但我该如何解决呢?
  2. 在这种情况下,全局是否会发生任何变化?如果不是,为什么?
  3. 我尝试做name = a.foo.name 而不是name = a.name,但这也没有成功,给了我:AttributeError: 'function' object has no attribute 'name', 这在任何情况下都可行吗?我做错了什么?

感谢您抽出宝贵时间,如果这对你们中的某些人来说似乎很明显,我很抱歉,我仍在继续。

【问题讨论】:

  • namea.py 中的定义在哪里?
  • @ozgur 是的,它在 a.py 的函数 foo() 中定义
  • 在函数内部定义的变量绑定到函数的局部范围,因此它们在函数外部不可见。您需要在 foo() 之外的 a.py 中的某处定义 name
  • @ozgur 问题是,稍后我想将“名称”更改为其他内容,当我在函数之外定义它时,导入时它总是会重置吗?
  • 其实不是,foo()执行一次后,即使你再次import a,变量name仍会在当前进程中保持"foo"

标签: python python-3.x import


【解决方案1】:

脚本不是模块。它有点让人费解,但是当你运行 python3 a.py 时,a.py 不是一个模块(或者更准确地说,它是一个名为 __main__ 的模块),它会在你导入时重新加载。

假设我有 c.py

print('hello')
if __name__=="__main__":
    import c

当我运行它时,我得到了

hello
hello

为了说明你的例子,如果我将 b.py 更改为

import __main__

def bar():
    name = __main__.name
    print(name)

它有效。但只是有点因为如果有人导入 a 你仍然有两个模块和两个变量副本。

如果您想要共享数据,它们必须在导入的模块中,而不是顶级脚本中。当我想要共享数据时,我创建了一个单独的模块,它不导入任何东西(或仅从标准库导入),它要么是空的,要么具有我想要共享的变量的默认值。

【讨论】:

  • 所以我想共享数据会起作用,我创建了 c.py 用于测试目的,只将 name="foo" 写入其中并使其工作,但问题是,如果我想改变c.py 中的“共享”变量名让我们说“bar”例如我将如何从 a.py 执行此操作?
  • 如果我理解你的问题,那就是c.bar = c.foo。如果你想完全摆脱原来的变量,那就是del c.foo
  • c.py 现在只有name="foo",我如何从a.py 中更改变量name 所以现在c.py 中有name="bar",你可能想知道我为什么要问这是因为稍后 b.py 将从 c.py 获取变量 name,其值为 name="bar" 这就是我对“共享数据”的理解
  • 任何模块都可以使用c.name = "bar" 更改变量。之后,任何引用c.name 的模块都会得到"bar"
  • 好的,知道了,非常感谢您对我的耐心等待!
猜你喜欢
  • 1970-01-01
  • 2015-08-08
  • 2013-01-12
  • 2016-01-16
  • 1970-01-01
  • 1970-01-01
  • 2012-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多