以下代码在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引发错误?
我能想到的唯一解释是,赋值创建了一个局部变量,即使在创建局部变量之前,它也优先于"全局"变量.当然,变量在存在之前"窃取"范围是没有意义的.cc+=1c
有人可以解释一下这种行为吗?
我在尝试理解python范围规则时遇到了麻烦.
使用以下脚本:
a = 7
def printA():
print "Value of a is %d" % (a)
def setA(value):
a = value
print "Inside setA, a is now %d" %(a)
print "Before setA"
printA()
setA(42)
print "After setA"
printA()
Run Code Online (Sandbox Code Playgroud)
给出了意想不到的(对我来说)输出:
Before setA
Value of a is 7
Inside setA, a is now 42
After setA
Value of a is 7
我希望最后一次打印a的值为42,而不是7.我对Python的全局变量范围规则缺少什么?
好吧,我只是试着看看变量范围如何工作并在以下情况下运行.全部从终端跑:
x = 1
def inc():
x += 5
inc()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in inc
UnboundLocalError: local variable 'x' referenced before assignment
Run Code Online (Sandbox Code Playgroud)
所以我思考得很好也许我的方法无法访问x,所以我尝试了:
def inc():
print(x)
1
Run Code Online (Sandbox Code Playgroud)
这样可行.现在我知道我可以这样做:
def inc():
global x
x += 1
Run Code Online (Sandbox Code Playgroud)
这会奏效.但我的问题是为什么第一个例子失败了.我的意思是我希望自从print(x)工作以来x在函数内可见,那么为什么x + = 5失败?
def Test(value):
def innerFunc():
print value
innerFunc()
def TestWithAssignment(value):
def innerFunc():
print value
value = "Changed value"
innerFunc()
Test("Hello 1")
# Prints "Hello 1"
TestWithAssignment("Hello 2")
# Throws UnboundLocalError: local variable 'value' referenced before assignment
# on the "print value" line
Run Code Online (Sandbox Code Playgroud)
为什么第二个失败,因为唯一的区别是在print语句之后的赋值?我对此非常困惑.
可能重复:
在python中赋值错误之前引用
我在python中遇到一个奇怪的错误.以下ipython日志对其进行了总结:
In [10]: def confused(stuff):
....: print huh
....: return stuff
....:
In [11]: confused(87)
0
Out[11]: 87
In [12]: def confused(stuff):
....: print huh
....: huh += 1
....: return stuff
....:
In [13]: confused(9)
---------------------------------------------------------------------------
UnboundLocalError Traceback (most recent call last)
/home/max/verk/btr-email/build/x86_64/bin/ipython in <module>()
----> 1 confused(9)
/home/max/verk/btr-email/build/x86_64/bin/ipython in confused(stuff)
1 def confused(stuff):
----> 2 print huh
3 huh += 1
4 return stuff
UnboundLocalError: local variable 'huh' referenced before assignment
Run Code Online (Sandbox Code Playgroud)
有效的函数和抛出错误的函数之间的唯一区别是+ = 1行,即使这样,它也会在以前工作的行上抛出错误!如果我在方法的第二个版本中global huh …