如果Python在函数范围内生成,为什么Python无法看到赋值?

时间:2017-02-14 16:54:48

标签: python scope

这是我的代码:

player1 = player2 = ball = score1 = score2 = None

def reset_game():
    player1 = Pad(PAD_WIDTH, (WINDOW_HEIGHT / 2) - (PAD_HEIGHT / 2), FIRST_PLAYER)
    player2 = Pad(WINDOW_WIDTH - (PAD_WIDTH * 2), (WINDOW_HEIGHT / 2) - (PAD_HEIGHT / 2), SECOND_PLAYER)
    ball = Ball((WINDOW_WIDTH / 2) - (BALL_SIZE / 2), (WINDOW_HEIGHT / 2) - (BALL_SIZE / 2))
    score1 = Score(((WINDOW_WIDTH / 2) - (SCORE_SIZE / 2.8) - SCORE_SPACING * 2), SCORE_SPACING, 1)
    score2 = Score(((WINDOW_WIDTH / 2) - (SCORE_SIZE / 2.8) + SCORE_SPACING * 2), SCORE_SPACING, 2)

reset_game()

我最初这样定义它们(我知道它有点像java-ish,但无论如何),因为当我按ESCAPE时,我想将整个游戏重置为其初始值:

if e.key == pygame.K_ESCAPE:
    reset_game()

复制并粘贴整个东西是可怜的。像这样运行,Python给了我错误:

enter image description here

这是因为Python只能看到函数内的赋值。

def redraw():
    pygame.display.flip()
    screen.fill((0, 0, 0))

    if game_screen == SINGLE_PLAYER or game_screen == MULTIPLAYER:
        draw_middle_line()
        player1.draw()
        player2.draw()
        score1.draw()
        score2.draw()
        ball.draw()

如果我在全球范围内进行作业,则可行。为什么Python即使我宣布"也无法看到作业。 as None并在之后调用带有赋值的函数? (我知道这是c / c ++ / java-ish思考,但它仍然有意义。)

3 个答案:

答案 0 :(得分:2)

Python不能看到作业"但只是你没有宣布你的名字是全球的。

https://docs.python.org/3/tutorial/classes.html#python-scopes-and-namespaces

https://docs.python.org/3/reference/simple_stmts.html#global

将您的功能更改为如下所示并尝试:

def reset_game():
    global player1, player2, player3
    player1 = Pad(PAD_WIDTH, (WINDOW_HEIGHT / 2) - (PAD_HEIGHT / 2), FIRST_PLAYER)
    player2 = Pad(WINDOW_WIDTH - (PAD_WIDTH * 2), (WINDOW_HEIGHT / 2) - (PAD_HEIGHT / 2), SECOND_PLAYER)
    ball = Ball((WINDOW_WIDTH / 2) - (BALL_SIZE / 2), (WINDOW_HEIGHT / 2) - (BALL_SIZE / 2))
    score1 = Score(((WINDOW_WIDTH / 2) - (SCORE_SIZE / 2.8) - SCORE_SPACING * 2), SCORE_SPACING, 1)
    score2 = Score(((WINDOW_WIDTH / 2) - (SCORE_SIZE / 2.8) + SCORE_SPACING * 2), SCORE_SPACING, 2)

PS。使用全局变量是非常差的设计。我建议使用不同的方法来组织程序的数据和代码。

答案 1 :(得分:1)

x = None

def foo():
    global x
    x = 10

foo()
print x #prints 10

本地范围内的任何赋值都被视为局部变量,您需要从全局范围获取它

答案 2 :(得分:-1)

如果您不向函数发送变量,它将尝试在本地创建变量,因此为了允许访问,它必须在函数内全局声明。

示例:

player1 = None

     def reset_game():
          global player1  #now you can modify player1
          player1 = Pad(PAD_WIDTH, (WINDOW_HEIGHT / 2) - (PAD_HEIGHT / 2), FIRST_PLAYER)

reset_game()