【问题标题】:Function Output fails函数输出失败
【发布时间】:2021-08-07 03:10:58
【问题描述】:

我是新手,有一个无法找到答案的新手问题(在此处或在 Google 上)。

我正在学习编写函数,但不明白为什么会这样。

代码:

#func

def draw(n):
    import random
    nbers=(random.sample(range(1,101), n))
    print(nbers)

ns=int(input("How many numbers you want?"))

draw(ns)
print(nbers)

日志:

 How many numbers you want?5
[57, 10, 76, 46, 66]

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-16-50675fd81745> in <module>
      9 
     10 draw(ns)
---> 11 print(nbers)

NameError: name 'nbers' is not defined

问题:

为什么打印输出(内部函数)有效,但如果我调用生成的列表(再次打印列表),它将为空?

如果列表在第一时间有数字并且当我再次打印它时数字消失了,我该如何使用输出?

这里发生了什么?

感谢您的帮助!

路德维希

【问题讨论】:

  • 如果您定义的每个函数都会创建可在外部范围内访问的名称,那么不发生冲突将非常困难。想象一个具有数千个功能的系统。您不希望名称从每个函数中泄漏出来。该名称仅在函数范围内有效,即在开始块的冒号和函数定义末尾的最终缩进之间。
  • 您可以从函数中返回值,并将它们分配给名称。
  • 但是,例如,这不会导致无法在另一个函数中使用输出吗?如果一个函数的结果只在产生它的那个中起作用,我该如何使用它?
  • 彼得伍德,谢谢大家的帮助!

标签: python list function random printing


【解决方案1】:

nbers不在全局范围内,只在draw范围内,也就是说只能在draw范围内访问。您可以将其退回而不是打印出来,以便在draw 之外访问它:

def draw(n):
    import random
    return random.sample(range(1,101), n)

ns=int(input("How many numbers you want?"))

nbers=draw(ns)
print(nbers)

或者,您可以使用全局范围:

#func

def draw(n):
    import random
    global nbers
    nbers=(random.sample(range(1,101), n))
    print(nbers)

ns=int(input("How many numbers you want?"))

draw(ns)
print(nbers) #at this point, draw() already printed nbers, so this just prints it again

【讨论】:

    【解决方案2】:

    我找到了解决您问题的简单方法。首先,这是您应该使用的代码...

    nbers = 0  #this sets the variable so that it can be called globally in the definition
    
    def draw(n):
         global nbers #this grabs the variable, and puts it on the global spectrum
         import random
         nbers=(random.sample(range(1,101), n))
         #print(nbers) used to be here, but I suggest removing it because then it will be printed twice
    
    ns=int(input("How many numbers you want?"))
    
    draw(ns)
    print(nbers)
    

    这应该可以很好地解决您的问题,我很乐意提供帮助!

    【讨论】:

    • 这不是一个好的修复方法。全局数据通常使推理代码、测试代码和重组代码变得困难。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多