为什么在函数中尝试使用global
进行条件转换时,即使if
不满足条件,该函数仍然有效吗?
示例:
>>> x=4
>>>
>>> def show():
... a=10
... if a==15:
... global x
... x=22
...
>>> x
4
>>>
>>> show()
>>> x
22
>>>
有什么办法可以限制全局吗?
答案 0 :(得分:2)
这是因为const St = imports.gi.St;
var Dummy = class Dummy extends St.Bin {
constructor() {
super();
}
foo() {
log("foo!")
}
};
let d = new Dummy();
d.foo();
--> RESULT: TypeError: d.foo is not a function
关键字会影响整个功能。它是解析器指令,而不是一些可执行的代码,这些可执行代码告诉Python解析器将标识符解释为全局标识符。也就是说,只要将其放在global
或if
块内,都没有关系,只要解析器看到它,它将在整个函数中从其所在的行开始生效。 / p>
全局语句是一个声明,适用于整个当前代码块。
有了上述内容,我会想像没有直接的方法可以实现这一目标。如果您不希望变量是全局变量,建议您使用其他名称,并在需要时分配给全局变量。
答案 1 :(得分:1)
因此,这些示例之间的区别是我看到了令人困惑的行为:
x=4
def show():
a = 10
if a == 15:
global x
x = 22
print(x)
show()
# print statement: 22
x
Out[31]: 22
这:
x=4
def show():
x = 22
print(x)
show()
# print statement: 22
x
Out[33]: 4
我提供的关于如何混合和匹配local
,nonlocal
和global
的最佳示例是基于Classes文档Scopes and Namespaces的示例。
def scope_test():
def do_local():
x = 22
print("in do_local:", x)
def do_nonlocal():
nonlocal x
x = 22
print("in do_nonlocal:", x)
def do_global():
global x
x = 22
print("in do_global:", x)
x = 4
do_local()
print("After local assignment:", x)
x = 4
do_nonlocal()
print("After nonlocal assignment:", x)
x = 4
do_global()
print("After global assignment:", x)
scope_test()
print("In global scope:", x)
结果:
in do_local: 22
After local assignment: 4
in do_nonlocal: 22
After nonlocal assignment: 22
in do_global: 22
After global assignment: 4
In global scope: 22
从他们的文本中(并将spam
替换为x
):
请注意本地分配(默认设置)如何保持不变 scope_test对垃圾邮件的绑定。非本地分配已更改 scope_test绑定了垃圾邮件,并且全局分配更改了 模块级绑定。
您还可以看到以前没有垃圾邮件绑定 全球任务。
要使用条件句进行设置,您可以尝试执行以下操作:
def scope_test(x,condition):
def do_local():
x = 22
print("in do_local:", x)
def do_nonlocal():
nonlocal x
x = 22
print("in do_nonlocal:", x)
def do_global():
global x
x = 22
print("in do_global:", x)
if condition==15:
do_global()
print("After global assignment:", x)
elif condition==10:
do_local()
print("After local assignment:", x)
else:
do_nonlocal()
print("After nonlocal assignment:", x)
value = 4
all_conditions = [5,10,15]
for condition in all_conditions:
scope_test(value,condition)
print("In global scope:", x,"\n")
输出:
in do_nonlocal: 22
After nonlocal assignment: 22
In global scope: 22
in do_local: 22
After local assignment: 4
In global scope: 22
in do_global: 22
After global assignment: 4
In global scope: 22
其他说明:iBug的答案来自文档:
全局语句是一个声明,适用于整个当前代码块。