2012-04-17 61 views
0

我是Python初学者。我写了类似如下的代码只是为了练习..请看看它为什么全局变量不能在Python的不同函数中工作?

i=1 
def wrte(): 
global i 
while i<5: 
    print "%s .Line..\n" %i 
    i+=1 

def appnd(): 
    j=i 
    while i in range(i,j+3): 
    print "%s .Line..\n" %i 
    i+=1 

def Main(): 
    wrte() 
    appnd() 

Main() 

输出类似如下

1 .Line.. 

    2 .Line.. 

    3 .Line.. 

    4 .Line.. 

**Traceback (most recent call last): 
    Line 18, in <module> 
    Main() 
    Line 16, in Main 
    appnd() 
    Line 9, in appnd 
    j=i 
UnboundLocalError: local variable 'i' referenced before assignment** 

预期结果::接下来的顺序应该附加像

5. Line.. 
6. Line.. 
7. Line.. 

请帮我在这..

+3

这是一个在'wrte',想想你在做什么正确的,使其工作... – 2012-04-17 09:06:44

回答

3

您需要在电子商务的global定义在你使用这个变量的函数中。

def appnd(): 
    global i 

注意:如果可能,请将全局变量和相关函数移动到类中。

0

加入

global i 

j=i 

应该解决的问题

+0

是的,这将工作! 每个函数都需要明确的“全局”关键字让我们知道我们打算使用全局变量:) – pk10 2014-04-18 20:47:57

0

你的定义是当地的范围。如果你在一个函数中声明一个变量为全局变量,这并不意味着它将被应用于所有函数。你必须在appnd()函数中声明我是全局的。尽管如此,这并不意味着你的风格是正确的。你宁愿将你的变量传递给函数。

0

下一个定义将工作:

def appnd(): 
    j=i 
    while i in range(i,j+3): 
    print "%s .Line..\n" %i 

# it would print infinitely, but will work 

在编译时Python的看着变量在函数中使用来定义范围寻找他们的方式。在你的appnd的定义中,它看起来分配为i,因此试图将其作为局部变量进行威胁。在我的代码中没有赋值,所以Python只需从父范围获得i的值 - 在这种情况下,i既不是本地也不是全局的,它被称为自由变量Execution model - Scopes and Binding - 强烈推荐阅读。

0

我想你应该知道什么时候应该使用global,否则它不会在你的写函数中。如果你只读取变量,你可以忽略它,我认为你想在你的追加函数中使用,但是你有一个i + = 1,所以你修改它。只要改变追加做到:

for line in range(i, i + 3): 
    print "%s .Line..\n" % line 
相关问题