Python全局声明打破了前一行

时间:2016-04-21 04:09:31

标签: python python-2.7 scope global

在下面的程序中,我尝试在函数内部分配具有不同值的oct,然后打印它。在outer_function()中,我指定oct = 10(第10行),这是私有变量。但我添加"全球oct"在第20行。所以我得到了一个Syntaxwarning。虽然奇怪的是我得到第19行的输出" oct在outer_function 2 = ABC"。这一行在全局声明之前,我认为它应该在第10行指定。

  1 #! /usr/bin/env python
  2 
  3 """
  4     Program:  function_scope.py
  5     Function:  Program for working through scope rules
  6 
  7 """
  8 
  9 def outer_function():
 10     oct = 10
 11     print "oct in outer_function 1 =", oct
 12     def inner_function():
 13         global oct
 14         oct = "ABC"
 15         print "oct in inner_function =", oct
 16 
 17 
 18     inner_function()
 19     print "oct in outer_function 2 =", oct
 20     global oct
 21     #del oct
 22 
 23 oct = 0
 24 print "oct in module before =", oct
 25 
 26 outer_function()
 27 
 28 print "oct in module after =", oct
 29 
 30 print "That's all folks!"

我得到的结果是:

In [245]: run ch05_03_function_scope.py
/home/sherlock/Desktop/IntroductionPython/Ch05_functions/ch05_03_function_scope.py:20: SyntaxWarning: name 'oct' is assigned to before global declaration
  global oct

oct in module before = 0
oct in outer_function 1 = 10
oct in inner_function = ABC
oct in outer_function 2 = ABC
oct in module after = ABC
That's all folks!

1 个答案:

答案 0 :(得分:0)

global的{​​{1}}声明是否在oct的值分配之前或之后无关紧要。这里oct将是整个函数的全局名称。它暂时不能是局部变量,后来变成全局变量。您会收到语法警告,因为将oct语句作为函数中的第一项内容是非常好的做法。

要自行检查,请将global添加到您的功能中:

print locals()

现在,运行你的程序。它会打印出来:

{}

这意味着没有当地人。所以第10行中的def outer_function(): oct = 10 print locals() 没有创建 由于第20行中的oct = 10而导致的局部变量。

现在,注释掉global oct声明

global

再次运行您的程序。它会打印出来:

print "oct in outer_function 2 =", oct
#global oct

现在你有一个在第10行创建的局部变量。