我是新手,试图学习python。
根据这篇文章http://www.tutorialspoint.com/python/python_modules.htm,我在下面的代码中得到一个UnboundLocalError,但我不明白为什么:
Money = 2000
def AddMoney():
# Uncomment the following line to fix the code:
# global Money
Money = Money + 1
print Money
AddMoney()
print Money
但是下面的代码工作正常
Money = 2000
def AddMoney():
# Uncomment the following line to fix the code:
# global Money
Money = 1
print Money //2000
AddMoney()
print Money //2000
他们在文章中解释了一些事情,但我仍然不确定我理解。 为什么我在第一个例子中得到UnboundLocalError
,但在第二个例子中却没有?
答案 0 :(得分:1)
AddMoney不知道之前定义了Money变量因此它与local variable 'Money' referenced before assignment
崩溃思考是一个应该在AddMoney class
内声明的局部变量。
如果取消注释AddMoney类中的global Money
行,它将起作用。
另外第二个例子正在运行,因为在行Money = 1
中你没有使用Money变量,你只是将一个值赋值给Money并覆盖全局值
答案 1 :(得分:1)
前言:我假设第二个片段中Money = 2000
之前的空格是错误的,因为在Python中空白是很重要的,但我认为它实际上并没有在这里做出改变。 / p>
在您的第一个示例中,Money = Money + 1
尝试从变量中读取,然后为其分配新值。本地范围中不存在Money
,因此会引发错误。第二个例子只是为变量赋值。 AddMoney()
创建一个名为Money
的局部变量,然后对其执行任何操作。正如你的评论所示,外部范围的Money
不变。
答案 2 :(得分:1)
正如你所提到的,文章确实解释了一点,但不是很多关于为什么。
当你编程并且你写了某些东西的名字时,计算机必须知道哪里去寻找那个东西。 其中是一个称为范围的术语。 Python中的所有变量都有一个范围。以下是一些例子:
from __future__ import print_function
value = 'blue'
def fun():
value = 'yellow'
print("Value in function: ", value)
print("Value before: ", value)
fun()
print("Value after: ", value)
# Output:
#
# Value before: blue
# Value in function: yellow
# Value after: blue
在此脚本中,您将value
定义为“蓝色”。然后在函数内部将其设置为“黄色”。但是为什么在调用函数后它不会保持“黄色”?范围界定。
在函数中定义value = 'yellow'
时,名称value
仅绑定到当前块内的'yellow'
(在这种情况下为函数) 。你会听到术语 shadow 或隐藏来解释这里发生的事情,因为这实际上是正在发生的事情。您正在使用新的value
隐藏原始value
,但是一旦您的功能结束,您的新值也会结束。
您可以使用globals()
和locals()
内置
from __future__ import print_function
from pprint import pprint
value = 'blue'
def fun():
print("Globals in function: ")
pprint(globals())
print("Locals in function: ")
pprint(locals())
value = 'yellow'
print("Value in function: ", value)
print("Globals at end of function: ")
pprint(globals())
print("Locals at end of function: ")
pprint(locals())
print("Globals before function: ")
pprint(globals())
print("Locals before function: ")
pprint(locals())
print("Value before: ", value)
fun()
print("Value after: ", value)
print("Globals after function: ")
pprint(globals())
print("Locals after function: ")
pprint(locals())
现在,python有一个global
关键字,允许你告诉Python,而不是查看本地范围,你想要查看全局这些变量的范围:
from __future__ import print_function
value = 'blue'
def fun():
global value
value = 'yellow'
print("Value in function: ", value)
print("Value before: ", value)
fun()
print("Value after: ", value)
# Output:
#
# Value before: blue
# Value in function: yellow
# Value after: yellow
在Python中,它将首先尝试在本地范围内解析名称,然后在全局范围内解析名称,这意味着您可以编写如下内容:
from __future__ import print_function
value = 'blue'
def fun():
print("Value in function: ", value)
print("Value before: ", value)
fun()
print("Value after: ", value)
# Output:
#
# Value before: blue
# Value in function: blue
# Value after: blue
但如果可以,那么为什么不是你的第一个例子Money = Money + 1
?答案很简单,虽然可能是意料之外的:
因为您试图在函数中重新定义Money
(Money =
部分),所以它无法在全局范围内查找您的变量,因为它不知道您是否打算使用全局版本或本地版本,您将获得UnboundLocalError
。所以你需要告诉Python你的意思:你想使用全球版本,还是应该在本地使用?
通过声明global Money
,您可以明确告诉Python您要使用全局版本。但是,如果您想使用本地内容,则需要使用其他名称,或者在尝试使用Money
之前定义Money + 1
。
答案 3 :(得分:0)
原因是全局变量和局部范围变量之间存在冲突 (正如其他人所说) 宣布金钱作为全球的功能应该是好的
Money = 2000
def AddMoney():
global Money
Money = Money + 1
答案 4 :(得分:0)
在这两个函数中,您需要删除“#global Money”行中的#标签才能使函数正常工作。 Python中的Hashtags导致该行的其余部分被“评论”,这些行不会影响您的代码,而是充当开发人员的注释。
此代码可以正常运行:
Money = 2000
def AddMoney():
# Uncomment the following line to fix the code:
global Money
Money = Money + 1
print Money
AddMoney()
print Money
在你的第二段代码中,该函数没有在函数环境之外重新定义变量钱,所以当没有出现错误时,你没有用代码完成你想要的东西。同样,删除主题标签(取消注释)将解决您的问题。这段代码可以使用:
Money = 2000
def AddMoney():
# Uncomment the following line to fix the code:
global Money
Money = 1
print Money //2000
AddMoney()
print Money //2000
希望这有帮助!