[英]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.