1

我是 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..

请帮我解决这个问题..

4

6 回答 6

3

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

def appnd():
   global i

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

于 2012-04-17T09:06:37.370 回答
1

下一个定义将起作用:

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它看到了 assign for ,i因此试图将其作为局部变量来威胁。在我的代码中没有赋值,所以 Python 只是i从父作用域获取值——在这种情况下i,它既不是局部的也不是全局的,它称为自由变量执行模型 - 范围和绑定- 强烈推荐阅读。

于 2012-04-17T09:16:27.887 回答
1

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

for line in range(i, i + 3):
    print "%s .Line..\n" % line
于 2012-04-17T09:18:08.877 回答
0

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

于 2012-04-17T09:13:22.497 回答
0

添加

global i

j=i

应该解决问题

于 2012-04-17T09:07:37.393 回答
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()
于 2019-01-25T09:48:46.390 回答