【问题标题】:'draw1' not defined, Highly confused'draw1' 未定义,高度混淆
【发布时间】:2017-05-02 14:34:07
【问题描述】:

所以我在做彩票抽号机,

import random

def lottoDraw1():
    draw1 = random.randint(1,49)

def lottoDraw2():
    draw2 = random.randint(1,49)
    if draw2 == draw1:
        lottoDraw2()

我收到错误消息“NameError: name 'draw1' is not defined”

如果我插入:

draw1 = 0

在代码之前,答案总是 0。 即使在我为 draw1 定义要更改之后。

我做错了什么?

【问题讨论】:

  • 当变量在本地定义时会发生这种情况...
  • 对不起,我在将代码输入问题时遇到了困难,随机导入是代码块的一部分,并且“ if draw2 == draw1: lottoDraw2() ”在下面
  • 请标记最佳答案

标签: python


【解决方案1】:

What are Python namespaces all about 这个问题要求命名空间,这基本上就是您遇到的问题。在 lottodraw1 中,您仅更改 draw1 的本地版本,因此 draw1 的全局值保持不变(在您的情况下为 0)。因此,您将始终在其他任何地方使用draw1 = None

我的方法是制作一个绘图数组并使用通用绘图函数:

draws = []

def draw():
    new_draw = random.randint(1,49)
    if new_draw not in draws:
        draws.append(new_draw)
    else:
        draw()

draw()
draw()
print(draws)

现在你可以调用draw,它会添加一个新开出的不存在的号码。

正如 Jean-François Fabre 所说,更好的版本是使用集合,它更快,但只允许唯一值:

draws = set()

def draw():
    new_draw = random.randint(1,49)
    if new_draw not in draws:
        draws.add(new_draw)
    else:
        draw()

draw()
draw()
print(draws)

【讨论】:

  • 使用这种方法,如果new_draw 已经在draws 中,draw() 将不会绘制任何内容。您可以像 OP 的代码一样尝试一个新的随机数,但如果有一些方法可以跟踪已经绘制了哪些数字,可能会更有效。
  • @Jean-FrançoisFabre 感谢您指出这一点,我进行了编辑以考虑您的建议
  • @JackTaylor 你的权利!完全忘记添加递归调用。已编辑!
  • 好。挑剔:只需draws = set()(无需传递空列表)
  • @Jean-FrançoisFabre 每毫秒和字符都很重要!
【解决方案2】:

您需要将draw1 设为全局变量

draw1, draw2 = None, None

def lottoDraw1():
    global draw1
    draw1 = random.randint(1,49)

def lottoDraw2():
    global draw1
    global draw2
    draw2 = random.randint(1,49)
    if draw2 == draw1:
        lottoDraw2()

但是,这不是一个好方法,这是另一个话题。

【讨论】:

  • 对不起,但是现在 "draw1" & "draw2" 的输出是 "None" 而不是 1,49 之间的随机数。
  • 你是如何执行这个的。你刚刚写了你的两个函数。你是如何调用/调用的?
  • 代码末尾写着,lottoDraw1(), lottoDraw2().___ print(draw1), print(draw2)。
  • @pEWpEW 立即尝试
  • C.Fe. 的回答有效,但我仍然想知道为什么我原来的方法没有输出它应该输出的东西?
猜你喜欢
  • 2012-11-15
  • 1970-01-01
  • 2015-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-15
  • 1970-01-01
相关资源
最近更新 更多