如何在函数中创建或使用全局变量?
如果我在一个函数中创建一个全局变量,我如何在另一个函数中使用该全局变量?我是否需要将全局变量存储在需要访问的函数的局部变量中?
以下代码在Python 2.5和3.0中按预期工作:
a, b, c = (1, 2, 3)
print(a, b, c)
def test():
print(a)
print(b)
print(c) # (A)
#c+=1 # (B)
test()
Run Code Online (Sandbox Code Playgroud)
但是,当我取消注释行(B)时,我得到了UnboundLocalError: 'c' not assigned
一行(A).的值a
和b
被正确地打印.这让我感到困惑,原因有两个:
为什么在行(A)处抛出运行时错误,因为后面的行(B)语句?
为什么变量a
和b
打印符合预期,同时c
引发错误?
我能想到的唯一解释是,赋值创建了一个局部变量,即使在创建局部变量之前,它也优先于"全局"变量.当然,变量在存在之前"窃取"范围是没有意义的.c
c+=1
c
有人可以解释一下这种行为吗?
test1 = 0
def testFunc():
test1 += 1
testFunc()
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
UnboundLocalError:赋值前引用的局部变量'test1'.
错误说这'test1'
是局部变量,但我认为这个变量是全局的
那么它是全局的还是本地的,如何解决这个错误而不将全局test1
作为参数传递给testFunc
?
def fun():
if False:
x=3
print(locals())
print(x)
fun()
Run Code Online (Sandbox Code Playgroud)
输出和错误消息:
{}
---------------------------------------------------------------------------
UnboundLocalError Traceback (most recent call last)
<ipython-input-57-d9deb3063ae1> in <module>()
4 print(locals())
5 print(x)
----> 6 fun()
<ipython-input-57-d9deb3063ae1> in fun()
3 x=3
4 print(locals())
----> 5 print(x)
6 fun()
UnboundLocalError: local variable 'x' referenced before assignment
Run Code Online (Sandbox Code Playgroud)
我想知道python解释器是如何工作的.请注意,x = 3根本不运行,并且不应将其视为局部变量,这意味着错误将是"名称'x'未定义".但是查看代码和错误消息,情况并非如此.谁能解释一下这种情况背后的python解释器编译的机制原理?
我有一种方法可以通过检查前三个字母/数字并确保它们在继续之前相同来工作
def combineProcess(request):
carID1 = request.POST['carID1']
carID2 = request.POST['carID2']
for x in range (0,3):
a += carID1.length(x)
b += carID2.length(x)
if a.equals(b):
//do something
Run Code Online (Sandbox Code Playgroud)
在它使用之前,现在它停止了,我收到了这个错误。
Exception Type: UnboundLocalError
Exception Value:
local variable 'a' referenced before assignment
Run Code Online (Sandbox Code Playgroud)
几周前我从未使用过它并没有改变任何东西,所以我将 a 和 b 设为全局。
def combineProcess(request):
carID1 = request.POST['carID1']
carID2 = request.POST['carID2']
global a,b
for x in range (0,3):
a += carID1.length(x)
b += carID2.length(x)
if a.equals(b):
//do something
Run Code Online (Sandbox Code Playgroud)
现在我收到此错误。
Exception Type: NameError
Exception Value:
name 'a' is not defined
Run Code Online (Sandbox Code Playgroud)
然后我删除了全局行并把这个
a = …
Run Code Online (Sandbox Code Playgroud) python ×5
scope ×3
compilation ×1
django ×1
interpreter ×1
loops ×1
python-3.x ×1
variables ×1