【问题标题】:Changes made to variable not reflected in console对变量所做的更改未反映在控制台中
【发布时间】:2019-10-30 02:28:04
【问题描述】:

代码说得更好:

import numpy as np
a = np.ones(shape=(4, 2))
def func():
    for i in a:
        print(i)

运行:

In[3]: func()
[1. 1.]
[1. 1.]
[1. 1.]
[1. 1.]
In[4]: a = np.zeros(shape=(4, 2))
In[5]: func()
[1. 1.]
[1. 1.]
[1. 1.]
[1. 1.]

请注意,我更改了 (a)。但是,当我再次运行该功能时,没有任何变化! 详细信息:Pycharm 的最新版本。配置 > 执行:使用 Python 控制台运行。

【问题讨论】:

  • 最初,它最初是一个具有模块化设计的大规模神经网络。经过 3 天的调试,我把它缩小到了。
  • @XaviMartínez 不,我不会更新函数。但是,是的,解决我的问题,我只需要再次定义相同的函数就可以了!但是,鉴于功能没有改变,为什么会这样。是 (a) 改变了。

标签: python pycharm python-import


【解决方案1】:

我不使用 Pycharm。但我想我知道为什么。

当您使用 Python 控制台运行时,它的后台应该有 from your-source-file import *

当您在控制台中将a 重新绑定到新对象时,该函数仍将在您的源文件中使用the a,而不是在控制台中使用the a

您可以通过明确的from your-source-file import * 进行尝试,然后采取其余操作来验证它。我自己在电脑上查过了。

如果您想了解原因,可以阅读4. Execution model: resolution-of-names — Python 3.7.3 documentation,并确保您理解这一点:

在代码块中使用名称时,将使用最近的封闭范围对其进行解析。对代码块可见的所有此类范围的集合称为代码块的环境。

我在 ipython 中的尝试:

In [2]: from test import *

In [3]: func()
[1. 1.]
[1. 1.]
[1. 1.]
[1. 1.]

In [4]: a = np.zeros(shape=(4, 2))

In [5]: func()
[1. 1.]
[1. 1.]
[1. 1.]
[1. 1.]

In [6]: def func():
   ...:     for i in a:
   ...:         print(i)
   ...:

In [7]: func()
[0. 0.]
[0. 0.]
[0. 0.]
[0. 0.]

In [1]: from auto_audit_backend.test_np import *

In [2]: func()
[1. 1.]
[1. 1.]
[1. 1.]
[1. 1.]

In [3]: a[0][0] = 666

In [4]: func()
[666.   1.]
[1. 1.]
[1. 1.]
[1. 1.]

In [5]: a = np.zeros(shape=(4, 2))

In [6]: func()
[666.   1.]
[1. 1.]
[1. 1.]
[1. 1.]

在 test.py 文件中使用您的代码。

【讨论】:

  • 哇,你真是个天才,你在不同的平台上重新生成了问题。那么,您是说 Pycharm 没有错误?
  • 如何防止这种情况发生?当我在试验神经网络时,这让我很头疼。
  • @AlexDeft 是的,我认为 Pycharm 没有错误,您可以在 Pycharm 控制台中尝试。这是 Python 的规则。
  • @AlexDeft 将你的变量传递给 func,而不是使用全局变量,这是一个坏习惯,当你从其他地方导入它时会无效。
猜你喜欢
  • 1970-01-01
  • 2012-09-24
  • 1970-01-01
  • 1970-01-01
  • 2017-07-11
  • 2023-03-27
  • 1970-01-01
  • 2015-11-02
  • 1970-01-01
相关资源
最近更新 更多