使用函数返回的变量时的NameError

时间:2015-11-03 21:29:23

标签: python function scope

我想返回变量aRoll,并将其用作下一个函数的参数。在这种情况下,aRoll会回答问题"让我们提高你的能力分数。准备? (Y / N)"一旦问题得到解答,原始输入就会存储在变量aRoll中并返回。

import random

pAbility = ['Str', 'Dex', 'Con', 'Int', 'Wis', 'Cha']
pScore = []

i = 0

def pQuestion():
    aRoll = raw_input("Let's roll your ability scores. ready? (y/n)")
    if aRoll not in ('y', 'n'): 
        print "Please type 'y' or 'n'"
        return pQuestion()
    else:
        return aRoll

def pStats(aRoll):
    while aRoll == "y":
        while i < 6:
            pScore.append(random.randint(7, 18))
            i = i + 1

        for score, ability in zip(pAbility, pScore):
            print str(score) + ":\t\t " + str(ability)

def pReroll():
    aRoll = raw_input("Do you wish to reroll? (y/n)")
    aRoll = aRoll.lower()
    if aRoll not in ('y', 'n'):
        print "Please type 'y' or 'n'"
        return pReroll()

pQuestion()

pStats()

pReroll()

print aRoll放在pQuestion()之后,在脚本底部,它告诉我aRoll未定义。我没有正确回复aRoll吗?

5 个答案:

答案 0 :(得分:2)

定义的

aRoll是每个函数中的一个单独的局部变量。您需要将其声明为全局(不是一个好主意),或者显式地将一个函数的返回值作为参数传递给下一个。例如,

rv = pQuestion()
rv2 = pStats(rv)
rv3 = pReroll(rv2)

(注意pReroll定义的变化,这需要。)

答案 1 :(得分:1)

其他几个答案部分正确,但你必须将他们的答案放在一起才能得到你想要的东西。在底部,它应该如下所示:

$args = array(
    'post_type' => array( 'books' ),
    'meta_query' => array(
        array(
            'key' => 'book_state',
            'value' => 'sold'
        )
    ),
    'posts_per_page' => 3,
);
$the_query = new WP_Query( $args );

if ( $the_query->have_posts() ) : 

    $booksNumber  = $the_query->found_posts; // returns 1282 instead of 3

    ...

首先,您要将aRoll = pQuestion() pStats(aRoll) 的内容分配给pQuestion()。接下来,您将其作为参数传递给aRoll。如果你不这样做会有一些事情发生:

  1. 由于您为pStats()定义了参数,因此当您尝试运行此参数时,解释程序会告诉您缺少参数。
  2. 由于pstats()的本地范围,该变量未在函数aRoll之外定义。
  3. 有关变量范围的更多信息,请查看here。此页面也可能有用:

    http://gettingstartedwithpython.blogspot.com/2012/05/variable-scope.html

答案 2 :(得分:0)

pQuestion()返回aRoll,但您永远不会分配返回值。 pStats()希望您传入aRoll,但您永远不会。

答案 3 :(得分:0)

您不会返回“变量”,而是返回return语句处的变量值。函数中变量的名称​​完全不相关。这是一件好事:函数是一种封装代码片段的方法。想象一个简单的函数,它会添加两个数字:

def add(a, b):
  result = a+b
  return result

然后作者改变主意并在函数内重命名变量:

def add(a, b):
  sum = a+b
  return sum

最后,他很聪明而且只是

def add(a, b):
  return a+b

作为此功能的用户,您不应该为功能内部的名称烦恼。您使用add函数是因为您希望它返回参数的总和,无论函数如何在内部工作。

如果要使用函数的结果,必须自己将其存储在变量中:

sum_of_2_and_3 = add(2,3)
print(sum_of_2_and_3)

答案 4 :(得分:0)

不要气馁,但是即使我们用aRoll纠正了问题,你的代码还有很长的路要走。您可能需要跟进其他一些问题。

关于你当前的问题:

aRollpQuestion()中定义,仅在该函数调用期间存在(仅在该函数中在范围中)。

当您在函数中return aRoll时,名称aRoll将丢失,并且aRoll&#34;的会弹出&#34;将函数放入调用代码中。不幸的是,你没有抓住这个价值,所以它基本上融入了以太,永远不会被再次看到。

为了捕获分配所需的值,如下所示:

 answer = pQuestion()

现在,您有一个名为answer的新变量,其中包含值&#34;弹出&#34;函数pQuestion()(在这种情况下为yn)。请注意,您也可以编写aRoll = pQuestion()并且您有一个名为aRoll的变量,其中包含来自pQuestion()的值,但重要的是,它不会是与pQuestion()相同的变量INSIDE answer ,因为那个已经丢失了。在你学习的过程中,在任何地方使用不同的变量名称可能是个更好的主意,这样你就不会感到困惑,并且相信同名的变量实际上是相同的(而不是不同的变量)偶然共享名称的范围)

这是一件事。接下来,您以某种方式获得aRollfoobarpStats()的值或您为该值赋予 pStats()的任何名称。您已经告诉aRoll期望收到一个值并将该值命名为aRoll - 但此pStats()与第一个值一样,仅在范围中在pStats()函数中。问题是,您实际上并未向 pStats(answer) 提供价值,您可以这样做:

 pStats(aRoll)

 pStats(foobar)

event.stopPropagation();

或您为变量选择的任何名称。

这个问题的另一个解决方案是将变量声明为全局变量,传递它们。我敦促你不要追求这个解决方案,因为它会导致非常糟糕的编程习惯,只应在极少数情况下使用 之后你完全理解本地范围的想法。