- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
当我错误地运行 CODE1 时,我正在检查 global 关键字如何为项目工作,它的工作方式出乎我的意料。 global 关键字在函数中生效,即使它不在执行部分(即在 if 条件不为真时)。
我一直在四处寻找有关 python 中的全局关键字的问题,但找不到对此的答复。我看到了:Python global keyword behavior , global keyword in python , Using global variables in a function
最有趣的是这个(但我不确定):Python global keyword
下面显示了我使用的代码的三个最小可重现示例:
CODE1(带全局关键字):
a = 0
def my_function():
b=2
if b==0:
print("first if")
global a
if b==2:
print("second if")
a = 2
print("func -> a", a)
print("func -> b", b)
if __name__ == '__main__':
my_function()
print("main -> a", a)
结果:
second if
func -> a 2
func -> b 2
main -> a 2
CODE2(没有全局关键字):
a = 0
def my_function():
b=2
if b==0:
print("first if")
if b==2:
print("second if")
a = 2
print("func -> a", a)
print("func -> b", b)
if __name__ == '__main__':
my_function()
print("main -> a", a)
结果:
second if
func -> a 2
func -> b 2
main -> a 0
CODE3(带全局关键字,但反转 if 语句):
a = 0
def my_function():
b=2
if b==2:
print("second if")
a = 2
print("func -> a", a)
print("func -> b", b)
if b==0:
print("first if")
global a
if __name__ == '__main__':
my_function()
print("main -> a", a)
结果:
File "global_var_test.py", line 18
global a
^
SyntaxError: name 'a' is used prior to global declaration
可以看出,if b==0:
始终为 False 而 if b==2:
始终为 True(打印确认)。我希望 CODE1 给出与 CODE2 相同的结果,因为 global a
在第一个示例中不会被执行,所以它与省略它是一样的。但它给出了一个令人难以置信的结果,其中 global 关键字仍然生效并且全局变量 a 更改为值 2。在此之后,我用 CODE3 进行了测试,认为 global 关键字在所有函数中都是可见的,无论其位置如何,并且那么 CODE3 应该给出与 CODE1 相同的结果。我又错了,它就像要执行 global a
一样(然后在分配之后引发异常)。
然后,我的最后一个问题是:¿ global 关键字是否(可能还有其他关键字,如 nonlocal 等)按照编写的顺序在代码中具有可见性,但独立于什么正在执行?
请帮我澄清一下。
最佳答案
我的 answer on this question可能有助于理解此处的一些技术细节,尽管这是一个略有不同的问题。
简而言之,正如您发现的那样,Python 编译器基本上会根据变量在函数内部的首次使用方式来确定变量的范围; this 不考虑控制语句等细节,所以如果它在看到 global
语句之前碰巧遇到像 a = 2
这样的赋值,它会决定 a
是局部变量。如果你尝试反转代码(你没有给出一个非常像这样的例子)这样编译器恰好看到 global
语句 first 它会起作用(尽管仍然是错误的代码):
a = 0
def my_function():
b=2
if b==2:
print("second if")
global a
print("func -> a", a)
print("func -> b", b)
if b==0:
print("first if")
a = 2
因此,出于实用/技术以及文体目的,您应该始终在函数的开头而不是其他任何地方声明global
(或nonlocal
)变量。
我不确定这是语言要求还是 CPython 的细节;这将是一个有趣的后续问题。
更新:是的,这是语言规范要求;见https://docs.python.org/3/reference/simple_stmts.html#grammar-token-global-stmt
Names listed in a
global
statement must not be used in the same code block textually preceding that global statement.
此处textually preceding 只是指代码的文本,而不考虑周围的细节,例如控制语句。这是因为 global
实际上是对 parser 的指令,它根据它第一次看到该变量的使用方式来确定该变量是具有局部绑定(bind)还是全局绑定(bind)。尽管在实现细节方面可能仍然不完全准确;例如CPython builds a symbol table对于代码模块,作为对从解析器返回的 AST 的单独传递。因此,代码的文本顺序也会影响遍历 AST 中节点的顺序。例如。您可以在 the visitor for global
statements 中查看错误消息的来源.
关于函数内部的 Python 全局关键字可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58592318/
如果我创建一个对象时没有使用 new 关键字,例如“Object s(someval)”,但该对象的构造函数使用了 new,当该对象超出范围时,是否会调用析构函数为其分配新的空间?我感觉好像是,但我不
在 SQL 语法中,我发现奇怪的规则表明 select * from ONLY (t1)是有效的 SQL。 我的问题是:什么是 ONLY在这种情况下是什么意思? 它在规范的“7.6 table ref
为什么使用 $(this) 而不是重新选择类很重要? 我在代码中使用了大量的动画和 CSS 编辑,并且我知道可以使用 $(this) 来简化它。 最佳答案 当您通过 jQuery 执行 DOM 查询(
我正在尝试使用 IN 关键字编写查询。 表A 属性标识、属性名称 表B key 、属性标识、属性值 根据提供的 key ,我想返回所有 attrName、attrVal 组合。结果将包含两个表中的列。
这个问题在这里已经有了答案: Why would you use "AS" when aliasing a SQL table? (8 个答案) 关闭 9 年前。 我不擅长写查询,但是从我开始使用
我读过,在 Java 中,您不必将 this 关键字显式绑定(bind)到对象,它由解释器完成。它与 Javascript 相反,在 Javascript 中你总是必须知道 this 的值。但是 Ja
Swift 中“with”关键字的用途是什么?到目前为止,我发现如果您需要覆盖现有的全局函数,例如 toDebugString,可以使用该关键字。 // without "with" you
这个问题在这里已经有了答案: What does the keyword "where" in a class declaration do? (7 个答案) 关闭 9 年前。 在下面的一段代码中(
免责声明:swift 菜鸟 您好,我刚刚开始学习 Swift,正在学习 Swift 编程语言(Apple 在 WWDC 期间发布的书籍),并且想知道“where”关键字是什么。它用于 let vege
深入研究文档后,我找不到以下问题的答案: 是否有任何理由反对使用 this 来引用当前对象,如下例所示? type MyStruct struct { someField string } fun
前言 最近在做THINKPHP开发项目中,用到了 parent:: 关键字,实际上 parent::关键字 是PHP中常要用到的一个功能,这不仅仅是在 THINKPHP 项目开发中,即使是一个小型
我们都知道且经常用到 unsigned 关键字,但有没有想过,与此对应的 signed 关键字有啥用? 复制代码 代码如下: int i = 0; signed
this关键字再java里面是一个我认为非常不好理解的概念,:)也许是太笨的原因 this 关键字的含义:可为以调用了其方法的那个对象生成相应的句柄。 怎么理解这段话呢? thinking i
一 什么是 synchronized synchronized 关键字提供了一种锁机制,能够确保共享变量互斥访问,从而防止数据不一致问题的出现。 synchronized 关键字包括 monitor
最近看了几篇 synchronized 关键字的相关文章,收获很大,想着总结一下该关键字的相关内容。 1、synchronized 的作用 原子性:所谓原子性就是指一个操作或者多个操作,要么全部执行并
在本教程中,您将借助示例了解 JavaScript 对象方法和 this 关键字。 在 JavaScript 中,对象也可以包含函数。例如, // object containing meth
有人可以解释一下 PHP“with”的作用吗? 示例开始: 假设我有一个类: \App\fa_batch 这句话有什么区别: $w = (with (new \App\fa_batch))
这个问题在这里已经有了答案: What is the difference between using the colon and as syntax for declaring type? (2
如果我在 WHERE 子句中使用以下任一项,是否会有很大不同: WHERE [Process Code] = 1 AND ([Material ID] = 'PLT' OR [Material ID]
This question is unlikely to help any future visitors; it is only relevant to a small geographic are
我是一名优秀的程序员,十分优秀!