与变量引用相关的特定问题

时间:2016-12-15 17:09:13

标签: python python-2.7 function variables reference

现在,我想明确表示我不想将变量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)

3 个答案:

答案 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
....