【问题标题】:Python: why aren't imported variables updating? [duplicate]Python:为什么不更新导入的变量? [复制]
【发布时间】:2017-10-06 21:18:09
【问题描述】:

This is apparently the same question as this(S.O. 直到后来才找到)。正在调查欺骗行为。但是,仅标题行就使这个问题成为一个有用的问题。

在以下(两)块代码中,为什么我导入时没有得到更新的值?

两个文件:import.py 和 export.py 这是export.py:

i=12345

def change_i(x):
  global i
  i=x
  print "export changed i to {0}".format(repr(i))

这里是 import.py:

from export import i, change_i

print "Import gets i={0}".format(repr(i))
change_i(5)
print "Import has i={0}".format(repr(i))

结果如下:

> python import.py 
Import gets i=12345
export changed i to 5
Import has i=12345

为什么 import.py 没有得到新值 5????

【问题讨论】:

  • 是的。但是 S.O.直到你找到了这个问题。所以是的,它是重复的,但我认为辅助搜索词很有用。绝对没有迹象表明这些是标题中的同一个问题。

标签: python import python-import


【解决方案1】:

不。原来这是一个谎言/误解。

当您导入时,您会导入已导入符号的当前值,并将其添加到您定义的命名空间中。 您不是在导入引用,而是在导入一个值。强>

因此,要获取i 的更新值,您必须导入一个包含对该符号的引用的变量。

换句话说,导入不像 JAVA 中的 import、C/C++ 中的 external 声明,甚至 PERL 中的 use 子句。

而是Python中的以下语句:

from some_other_module import a as x

更像是 K&R C 中的以下代码:

extern int a; /* import from the EXTERN file */

int x = a;

(警告:在 Python 案例中,“a”和“x”本质上是对实际值的引用:您不是在复制 INT,而是在复制引用地址)

This is sneakily defined in the Python language reference: 使用 object 而不是 symbol。我建议 Python 语言参考使这一点更清晰,更不合法。

from 表单不绑定模块名称:它通过 标识符列表,在找到的模块中查找它们中的每一个 步骤(1),并将本地命名空间中的名称绑定到 object 从而 找到了。

【讨论】:

  • 现在对列表进行同样的尝试。将列表分配给i 并将change_i 修改为追加 或以其他方式修改i,而不更改i 所指的内容。
  • 你只是从我的回答开始重复我的陈述。你的意思是什么?
  • 实际上,您确实导入了对另一个模块中相同对象的引用。没有谎言,没有复制。问题是,i=x 重新绑定模块命名空间中的 i 到不同的对象。
  • @MarkGerolimatos 我的意思是您对 Python 引用和导入系统的工作方式有误解,因此您的答案是错误的。您没有尝试使用列表,是吗?列表已更新,您也可以在 import.py 中看到它的变化。
  • Python 导入对对象的引用,该对象由您尝试导入的变量引用。是的,将它重新绑定到模块内的其他对象不会更改您之前导入的引用。尽管如此,从技术上讲,Python 会导入对值的引用,这意味着您的第一段具有误导性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-15
  • 1970-01-01
  • 2015-03-05
  • 2013-09-17
  • 2019-08-19
  • 2019-06-22
  • 2018-11-18
相关资源
最近更新 更多