繁体   English   中英

python全局变量在函数中通过if语句求值时在函数中不起作用

[英]python global variable doesn't work in function when it is evaluated by an if statement in function

范例1:

a=1
def b():
    print a
    a=2
    print a

范例2:

a=1
def b():
    print a
    if a==1:
        a=2
    print a

示例1按预期方式工作,示例2失败,并出现UnboundLocalError:在第一次打印a之前分配了本地变量'a'

有人可以解释为什么会这样吗? 是错误还是功能?

第二个示例不是很有用,但是我不明白为什么它不起作用。 我希望函数b首先打印全局a,然后检查全局a是否为1。如果这是正确的局部a,则将其设置为2。然后将根据全局a的值打印全局a或局部a。 在示例中,全局a为1,因此我希望看到局部a的值为2。

范例3:

a=1
def b():
    print a

作品

范例4:

a=1
def b():
    print a
    a=2

失败,正如示例1正确地指出的那样,我实际上只测试了示例3,并认为它与示例1相同。

现在,我了解了整个示波器上经常重复出现的事情。 这对我来说是全新的,下面的示例(Ipython)让我很开心:

In [13]: a=1

In [14]: def b():
   ....:     a=2
   ....:     global a
<input>:3: SyntaxWarning: name 'a' is assigned to before global declaration
<input>:3: SyntaxWarning: name 'a' is assigned to before global declaration
<input>:3: SyntaxWarning: name 'a' is assigned to before global declaration
   ....:     print a
<input>:3: SyntaxWarning: name 'a' is assigned to before global declaration
<input>:3: SyntaxWarning: name 'a' is assigned to before global declaration
<input>:3: SyntaxWarning: name 'a' is assigned to before global declaration
   ....:     
<input>:3: SyntaxWarning: name 'a' is assigned to before global declaration
<input>:3: SyntaxWarning: name 'a' is assigned to before global declaration
<input>:3: SyntaxWarning: name 'a' is assigned to before global declaration
<input>:3: SyntaxWarning: name 'a' is assigned to before global declaration
<input>:3: SyntaxWarning: name 'a' is assigned to before global declaration
<input>:3: SyntaxWarning: name 'a' is assigned to before global declaration
<input>:3: SyntaxWarning: name 'a' is assigned to before global declaration
<input>:3: SyntaxWarning: name 'a' is assigned to before global declaration
<input>:3: SyntaxWarning: name 'a' is assigned to before global declaration
<input>:3: SyntaxWarning: name 'a' is assigned to before global declaration
<input>:3: SyntaxWarning: name 'a' is assigned to before global declaration
<input>:3: SyntaxWarning: name 'a' is assigned to before global declaration
<ipython-input-14-4fe1c6cdc9d0>:3: SyntaxWarning: name 'a' is assigned to before global     
declaration
  global a

In [15]: b()
2

In [16]: print a
2

因此,机制不同于声明函数或类似的事情,在声明函数或类似的事情之后,我只能在更改状态后才能访问状态。

python中是否还有其他类似的动作-穿越时间?

为了使示例正常工作,可以使用globals():

示例1的工作方式:

a=1
def b():
    print globals()["a"]
    a=2
    print a

示例2工作:

a=1
def b():
    global_a=globals()["a"]
    print global_a
    if global_a==1:
        a=2
    print a

示例4的工作:

a=1
def b():
    print globals()["a"]
    a=2

Python根据解析时的分配确定名称的范围。 如果您分配一个名称,则该名称在整个作用域内都是本地 您在b()中分配了a ,因此它是本地名称,永远不会被视为全局名称。

在这种情况下,您必须告诉解析器将a显式地视为全局:

def b():
    global a
    print a
    if a==1:
        a=2
    print a

请注意,您的第一个示例由于完全相同的错误而失败; 您也在该版本中分配,因此也会引发UnboundLocalError

>>> a=1
>>> def b():
...     print a
...     a=2
...     print a
... 
>>> b()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in b
UnboundLocalError: local variable 'a' referenced before assignment

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM