为什么“全局”在“如果”中不起作用?

时间:2019-08-10 03:38:43

标签: python-3.x

为什么在函数中尝试使用global进行条件转换时,即使if不满足条件,该函数仍然有效吗?

示例:

>>> x=4
>>>
>>> def show():
...     a=10
...     if a==15:
...        global x
...     x=22
...
>>> x
4
>>>
>>> show()
>>> x
22
>>>

有什么办法可以限制全局吗?

2 个答案:

答案 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解析器将标识符解释为全局标识符。也就是说,只要将其放在globalif块内,都没有关系,只要解析器看到它,它将在整个函数中从其所在的行开始生效。 / p>

Python documentation says

  

全局语句是一个声明,适用于整个当前代码块。

有什么办法可以限制全局吗?

有了上述内容,我会想像没有直接的方法可以实现这一目标。如果您不希望变量是全局变量,建议您使用其他名称,并在需要时分配给全局变量。

答案 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

我提供的关于如何混合和匹配localnonlocalglobal的最佳示例是基于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的答案来自文档:

  

全局语句是一个声明,适用于整个当前代码块。