现在,我想明确表示我不想将变量b
作为函数g
的参数包含在内。有没有其他方法可以重写这段代码,因为g是递归调用的?即使提到b = 0并将其称为全局也不会对参考分配错误有所帮助。
global b
b = 0
def g(x):
if b < x:
for i in range(10):
if u == i:
b += 1
g(x) #g is called recursively
for u in range(20):
b = 5
g(7)
答案 0 :(得分:1)
# that is from MSeifert(voted is correct), @Chalid
b = 0
first = []
second = []
def g(x):
global b # So python knows you use the global variable!
first.append(b)
if b < x:
for i in range(10):
if u == i:
b += 1
g(x)
for u in range(20):
b = 5
g(7)
# my solution is without any global variable
# and the result matching the expectation
def g(x,b):
second.append(b)
if b < x:
for i in range(10):
if u == i:
b += 1
g(x,b) #g is called recursively
b = 5
for u in range(20):
g(7,b)
print len(first), len(second)
print first
print second
40 40
[5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5]
[5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5]
答案 1 :(得分:1)
global
变量时,会使用 global
。因此,您需要在函数内使用global b
而不是外部:
b = 0
def g(x):
global b # So python knows you use the global variable!
if b < x:
for i in range(10):
if u == i:
b += 1
g(x)
for u in range(20):
b = 5
g(7)
由于您在b += 1
功能中使用了g
,因此您需要将b
声明为global
。否则你得到一个UnboundLocalError
:
UnboundLocalError:在赋值之前引用的局部变量'b'
另请参阅Python FAQ:
Python中的局部变量和全局变量有哪些规则?
在Python中,仅在函数内引用的变量是隐式全局变量。如果在函数体内的任何位置为变量赋值,则除非明确声明为全局,否则将其视为局部值。
虽然起初有点令人惊讶,但片刻的考虑解释了这一点。一方面,对指定的变量要求
global
可以防止意外的副作用。另一方面,如果所有global
引用都需要global
,那么您将一直使用global
。您必须将每个对内置函数或导入模块组件的引用声明为global
。这种混乱会破坏global
声明用于识别副作用的有用性。
答案 2 :(得分:0)
它可能会让人的头发竖立,但您可以将b
作为属性添加到g
。
def g(x):
If g.b > x:
...
g.b = 5
....