为什么全局变量不能在Python中的不同函数中工作?

时间:2012-04-17 09:03:04

标签: 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..

请帮帮我..

6 个答案:

答案 0 :(得分:3)

您需要在使用该变量的每个函数中定义global

def appnd():
   global i

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

答案 1 :(得分:0)

添加

global i

j=i

应解决问题

答案 2 :(得分:0)

您的定义范围是本地的。如果在函数中将变量声明为全局变量,则并不意味着它将应用于所有函数。你必须在你的appnd()函数中声明我是全局的。 话虽如此,但这并不意味着你的风格是对的。您宁愿将变量传递给函数。

答案 3 :(得分: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 - 强烈推荐阅读。

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

appnd 函数中,必须将全局变量设置为 i

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

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

def Main():
   wrte()
   appnd()

Main()
相关问题