2015-10-30 175 views
-1

我有一个简单的代码像这样的:蟒蛇变量

def function(): 
    ciao = stuff + stuff2 
    return ciao 

def megaf(): 
    stuff = 1 
    stuff2 = 3 
    for t in range(10): 
     stuff += 1 
     stuff2 += 2 
     print function() 

megaf() 

当我运行的代码是

NameError: global name 'stuff' is not defined

我得到的错误,我不明白为什么,因为我确定了变量。

我试着定义了两个变量stuffstuff2以外的函数,但我得到的错误“UnboundLocalError:本地变量'的东西引用前分配”。 我实际上无法理解问题是什么,所以我甚至无法找出解决方案。

+3

你必须将'stuff'和'stuff2'传入'function'。 –

+2

变量有一个叫做**范围**的东西。这需要深入的解释;例如,尝试阅读[此链接](http://python-textbok.readthedocs.org/en/latest/Variables_and_Scope.html)。 – Claudiu

回答

0

在python变量有两种风格,本地和全局。局部变量只能在函数内部看到(而且每次调用函数都是不同的),而全局可以从任何地方看到(并且是持久的)。

此外,还可以使用具有相同名称的全局变量和局部变量。如果函数中有一个局部变量,则它是该名称引用的局部变量。

为了确定一个函数中的变量是局部还是全局的,你必须检查它是如何使用的。基本上它的假设,除非是本地的:

  • 它声明为全球使用global statment
  • 它没有被分配到。

在你第一次尝试分配给stuffstuff2megaf所以它被认为地方开始(因为你没有把它声明为全局)。因此,您无法在megaf之外访问它们。

在你尝试将其分配给stuffstuff2以外的megaf你仍然分配给他们megaf使stuffstuff2本地megaf来解决这个问题。 stuffstuff2的用法引用了局部变量,但由于在使用它们之前尚未分配给局部变量(请注意,外部赋值为stuffstuff2的全局变量不同)。

有两种解决方法。首先,肮脏的是简单地宣布他们是全球性的:

def function(): 
    ciao = stuff + stuff2 
    return ciao 

def megaf(): 
    global stuff, stuff2 

    stuff = 1 
    stuff2 = 3 
    for t in range(10): 
     stuff += 1 
     stuff2 += 2 
     print function() 

这很脏,因为它通常被认为是穷人的做法使用全局变量。另一种解决方案是将它们作为参数传递给function,如其他答案中所述。

1

变量stuff和stuff2只在megaf()中是已知的。 通的东西,stuff2到()函数是这样的:

def function(stuff, stuff2): 
    ciao = stuff + stuff2 
    return ciao 

def megaf(): 
    stuff = 1 
    stuff2 = 3 
    for t in range(10): 
     stuff += 1 
     stuff2 += 2 
     print function(stuff, stuff2) 
megaf() 
0

你必须参数添加到函数。

def function(stuff, stuff2) 

和调用函数时然后执行:

print function(stuff, stuff2) 

这增加了这两个变量的function()

您的总体代码应该是这样的:

def function(stuff, stuff2): 
    ciao = stuff + stuff2 
    return ciao 

def megaf(): 
    stuff = 1 
    stuff2 = 3 
    for t in range(10): 
     stuff += 1 
     stuff2 += 2 
     print function(stuff, stuff2) 

megaf() 

功能将无法读取变量,除非你要么使全局变量或插入参数。

1

在python中,如果你在一个函数中创建一个变量,该变量将在该函数结束时停止存在。

def foo(): 
    i = 7 

def bar(): 
    n = i + 7 #This will not work. 

,如果你希望你的function两个数字加在一起,通过这两个数字作为参数,这样你应该做的:

def sum(num1, num2): 
    return num1 + num2 

然后在megaf

for t in range(10): 
    stuff += 1 
    stuff2 += 2 
    print sum(stuff, stuff2)