【发布时间】:2021-07-18 13:48:16
【问题描述】:
这可能是显而易见的,但我很困惑。
我有一个 Python 脚本 test.py:
def t():
print(a)
a = 1
t()
当我运行它时,它会按预期打印 1:
runfile('C:/Users/Dave/data/Code/Python/lib/test.py', wdir='C:/Users/Dave/data/Code/Python/lib')
1
但是当我以交互方式键入“a = 999”并再次运行 t() 时,我希望它会打印 999。但它会打印 1。为什么?
runfile('C:/Users/Dave/data/Code/Python/lib/test.py', wdir='C:/Users/Dave/data/Code/Python/lib')
1
a = 999
t()
1
FWIW,我正在 Spyder 中运行 iPython。
我认为这很奇怪而不是我应该期待的是否正确?
截图(添加):
【问题讨论】:
-
runfile是什么?我预计正在发生的事情是test.py模块内的a遮蔽了您在外部范围中定义的a。 -
@Samwise 我不知道。这是当我在 Spyder IDE 中点击“运行”按钮时打印的内容。 spyder-ide.org
-
不知道它是如何工作的,我不能肯定地说,但一般来说,你应该避免像这样使用“全局”变量(通常不是真正的全局变量)。它几乎总是令人困惑,而且几乎从来没有让任何事情变得更容易。
-
我不使用它,但看起来
runfile是 Spyder 特有的东西。它的行为似乎就像它导入了文件一样,因此t和a位于交互式 shell 的命名空间中,但t使用它所在模块的全局a。 -
(这里是 Spyder 维护者) 要在 Spyder 上正确解决这个问题,请查看我上面链接的答案。