- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个用 Python 3.5 编写的程序的一部分,并从测试前两个模块开始。我设法在其中一个模块中找出一个问题,似乎两个全局变量无缘无故地切换回它们的原始值,我无法理解。这些全局变量之一 (event_count
) 仅在一个函数中使用(grep 显示字符串“event_count”未出现在我的任何 *.py 文件中的任何其他位置),但值变量在函数调用之间发生变化。如果我在这个模块中为其他全局变量添加打印语句,它也会同时恢复到它的原始值。将 event_count
移动到另一个模块(将其替换为 eventcount()
中的 sensorlogic.event_count
并将初始化移动到另一个模块)使行为继续离开,所以我有解决办法但不理解。
这是模块 sensoreval
中使用 event_count
的所有代码:
event_count = 0
def eventcount(increment):
global event_count
print("entering eventcount, increment =", increment,
", event_count =", event_count)
event_count += increment
print("leaving eventcount, event_count =", event_count)
return event_count
如果我运行以下代码段:
e.setvalue(1)
print("I am at marker #1")
eventcount(0)
(e.setvalue()
中的最后一个操作是调用 eventcount(0)
)它产生以下输出:
entering eventcount, increment = 0 , event_count = 4
leaving eventcount, event_count = 4
I am at marker #1
entering eventcount, increment = 0 , event_count = 0
leaving eventcount, event_count = 0
我曾尝试将这两个模块缩减到合理的大小,但是当我这样做时问题仍然存在。我会继续努力。由于我以前从未使用过 Python 3,并且只有一点点 Python 2.7 经验,所以我认为我在做一些愚蠢的事情,我只是不知道是什么。
我相信我的示例与一些相关帖子的不同之处在于,变量 event_count
只是全局变量,因此它将是静态的。它仅用于此单一功能。字符串“event_count”没有出现在这个模块或任何其他模块的任何其他地方。
在多次编辑/重新运行迭代之后,我有一个易于管理的小示例来演示正在发生的事情。涉及两个模块,共8行代码。第一个模块 a.py
是 __main__
:
import b
c = 0
if __name__ == '__main__':
b.init()
print("c =", c)
第二个模块是b.py
:
import a
def init():
a.c = 1
运行 a.py
产生输出:
c = 0
我预计 c
仍然是 1 来自 b.py
中的 a.c = 1
。
此外,我试图通过从 a.py
中删除 if __name__ == '__main__'
来进一步减少它,但是示例不再运行:
Traceback (most recent call last):
File "...\a.py", line 1, in <module>
import b
File "...\b.py", line 1, in <module>
import a
File "...\a.py", line 3, in <module>
b.init()
AttributeError: module 'b' has no attribute 'init'
我也无法解释,但它似乎是相关的。
在 Mata 的带领下,我相信以下代码显示了正在发生的事情。涉及三个模块。 a.py
:
print("__name__ =", __name__)
import b
print("__name__ =", __name__)
def f(): pass
print(f)
if __name__ == '__main__':
print("f is b.a.f?", f is b.a.f)
b.py
:
import a
c.py
:
import a
import b
print("__name__ =", __name__)
print("a.f is b.a.f?", a.f is b.a.f)
运行a.py
可以看到问题,给出结果:
__name__ = __main__
__name__ = a
__name__ = a
<function f at 0x0000021A4A947840>
__name__ = __main__
<function f at 0x0000021A484E0400>
f is b.a.f? False
运行 c.py
以便 __main__
不是导入周期的一部分导致:
__name__ = a
__name__ = a
<function f at 0x000001EA101B7840>
__name__ = __main__
a.f is b.a.f? True
最佳答案
让我们逐步查看您的双模块示例。那里的行为是预期的,但最初令人困惑,并且可能很好地解释了其他情况下发生的事情。
如果您将 a
作为脚本运行,它不会作为 a
导入到 sys.modules
中,而是作为 __main__
。第一条语句是 import b
,它创建一个空模块对象 sys.modules['b']
并开始初始化它。
b
的第一行再次导入a
。通常,会找到 sys.modules['a']
下的模块对象,但在这种情况下,您正在将 a
作为脚本运行,因此发生了初始导入在不同的名字下。由于 a
的名称是 a
而不是 __main__
这一次, a.c
被设置为零并且没有其他任何事情发生.
现在执行返回到b
。它现在创建一个函数 init
,它将 sys.modules['a'].c
设置为 1。我非常明确地写出了对 a
模块的引用,因为这是造成您的差异的根本原因。
一旦 b
被导入,执行返回到 a
,而不是 sys.modules['a']
。下一行 c = 0
实际上将 sys.modules['__main__'].c
设置为零。希望你现在看到了问题。下一行调用 b.init
,它将 sys.modules['a']
设置为 1。然后打印 sys.modules['__main__']
,如预期的那样为零。
为了验证这个说明的正确性,尝试添加打印语句
print(sys.modules['a'].c)
您将获得 1
。此外,sys.modules['a'] is sys.modules['__main__'].c
将是 False
。解决此问题的最简单方法是不在给定模块的导入中初始化其他模块的成员。
您的具体案例记录在此处:http://effbot.org/zone/import-confusion.htm#using-modules-as-scripts .
其他资源
您可以在此处获得有关导入系统的详细信息的更多信息:https://docs.python.org/3/reference/import.html .此处描述了各种导入陷阱和注意事项:http://python-notes.curiousefficiency.org/en/latest/python_concepts/import_traps.html .
关于python - Python 模块中的全局变量自发重置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39708118/
我有一个“设置首选项”屏幕。它有一个 ListPreference 和一个 CheckBoxPreference。当我选择 ListPreference 的一项时,我想更改应用程序的日期格式。另外,通
我试图找到创 build 置/配置窗口的示例。单击菜单项中的“选项”操作可启动设置窗口。我想弄清楚如何从主窗口打开第二个窗口。以及新窗口如何将设置信息返回主窗口。尝试使用 QDialog 或一些继承的
我在 Lnux 上有 Qt 应用程序。我想为此创建一个可执行文件/设置以便在 Windows 上分发它并且不需要安装 Qt。我通过包含所有 dll 为此创建了可执行文件但要运行它,用户需要进入文件夹。
我正在尝试创建一个有点动态的 html 类,它根据类末尾包含的数字设置宽度 %。注意:类名将始终以“gallery-item-”开头 示例:div.gallery-item-20 = 20% 宽度 我
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 6 年前。 Improve this qu
在我的应用程序中,我想记住一些变量,例如,如果用户登录过一次,那么他们将在下次重新打开应用程序时登录,或者如果他们决定禁用某些提醒,应用程序可以检查该变量是否是错误的,将不再显示该提醒。理想情况下,这
我在 Netbeans 中开发了一个应用程序,它连接到远程计算机的消息队列并发送消息。该应用程序还有其他功能。项目完成后,我清理并构建应用程序,然后 Netbeans 创建一个 jar 文件。 但我的
我创建了一个 Outlook 加载项,需要创建一个设置以使其可分发(我是新手,所以请原谅新手评论) Outlook -2010 Vs -2010 .Net 4.0 我读了一些地方,最简单的方法就是发
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: How to make installer pack of Java swing Application Proje
这个问题肯定已经被很多人解决过很多次了,但是经过几个小时的研究,我仍然没有找到我要找的东西。 我有一个 ExportSettings.settings 文件,其中包含一堆设置( bool 值、字符串、
我想为我的项目创建一个安装程序,以便它可以安装在任何电脑上而无需安装头文件。我怎样才能做到这一点? 最佳答案 一般有两种分发程序的方法: 源代码分发(要构建的源代码)。最常见的方法是使用 GNU au
如何在这样的动态壁纸中创 build 置 Activity ? Example Picture 我只用一个简单的文本构建了设置 Activity ,但遇到了一些问题。第一个问题是我不能为此 Activ
我用 GUI 创建了一个简单的软件。它有几个源文件。我可以在我的编辑器中运行该项目。我认为它已经为 1.0 版本做好了准备。但我不知道如何为我的软件创 build 置/安装程序。 源代码是python
我的 SettingsActivity当前扩展了 Android Studio 生成的类,AppCompatPreferenceActivity扩展 PreferenceActivity . Acti
我正在使用 .NET 为 IE 开发工具栏。目前,我使用 gacutil 插入我的 .NET 程序集,并使用 regasm 注册我的 COM 程序集。 我想为项目创建一个设置 (MSI),但我似乎无法
在为设置页面创建 Activity 后,我注意到 if (mCurrentValue !== value) 中的 mCurrentValue !== value 返回警告: Identity equa
我在 Visual Studio 10 中创建了一个项目,该项目使用 Mysql 数据库和 Crystalreports 以及 它。但是我不知道如何进行自动安装 Mysql 和 Crystalrepo
我正在尝试在我的 C# 项目中使用 Sqlite 数据库,并且我在 IDE 中做得很好。我的问题是当我为我的项目制作安装包并安装它时,程序无法访问 sqlite 数据库。我也知道这是因为用户没有访问文
我有一个大型 Web 应用程序(带有 11 子系统的 ErP),我想使用 Microsoft WebPI 为它创建一个设置。 目前,我们每周向客户发送一次应用程序(用于每周更新)。 我们在此应用程序中
所以我对工资单申请的最终查询是 - 如何为薪资申请创 build 置? 我需要知道的一切- 如何将设置项目添加到我现有的解决方案 如何将解决方案中的文件添加到安装项目中,以及添加哪些文件添加和在什么文
我是一名优秀的程序员,十分优秀!