0

我制作的代码有效,但我想知道为什么。我不小心在代码中犯了一个错误,但由于某种原因它可以工作,为什么?当我传递lastkeys给时move.mov,键不应该是一个新变量吗?与 , 相同ent.playerlocation,不应该playermove.mov一个新变量吗?当我退出函数时,原始变量将更改为新变量的值。我试图重新创建它,但无法做到。

主要.py:

import pygame
import move, updatescreen

class entities:
    def __init__(self):
        self.playerlocation = [64,64]

if __name__ == '__main__':
    pygame.init()
    screen=pygame.display.set_mode((640,360),pygame.RESIZABLE,32)#pygame.FULLSCREEN
    pygame.display.set_caption('Pygame Window')

    ent = entities()
    lastkeys = [0,0,0,0]
    ispaused = 0

    while True:
        move.userevents(lastkeys)
        move.mov(lastkeys, ent.playerlocation)
        updatescreen.gameupdate(screen,ent)

移动.py:

import pygame, sys

def userevents(keys):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                keys[0] = 1
            elif event.key == pygame.K_RIGHT:
                keys[1] = 1
            elif event.key == pygame.K_UP:
                keys[2] = 1
            elif event.key == pygame.K_DOWN:
                keys[3] = 1
        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT:
                keys[0] = 0
            elif event.key == pygame.K_RIGHT:
                keys[1] = 0
            elif event.key == pygame.K_UP:
                keys[2] = 0
            elif event.key == pygame.K_DOWN:
                keys[3] = 0

def mov(keys,player):
    if keys[0]:
        player[0] -=1
    elif keys[1]:
        player[0] +=1
    if keys[2]:
        player[1] -=1
    elif keys[3]:
        player[1] +=1
4

2 回答 2

2

当您传入一个可变对象时,它会通过引用传入(因此,您对其所做的任何修改都会影响原始对象)。例如:

>>> def change_list(lst):
...   lst[0] = lst[0] * 2
... 
>>> a = [1,2,3]
>>> change_list(a)
>>> a
[2, 2, 3]

因此,要么在将列表传递给函数之前复制它:

>>> def change_list(lst):
...   lst[0] = lst[0] * 2
... 
>>> a = [1,2,3]
>>> cpy_a = list(a)
>>> change_list(cpy_a)
>>> a
[1, 2, 3]

或者在它被传递到函数之后:

>>> def change_list(lst):
...   lst_cpy = list(lst)
...   lst_cpy[0] = lst_cpy[0] * 2
... 
>>> a = [1,2,3]
>>> change_list(a)
>>> a
[1, 2, 3]

有关更彻底的讨论,请参阅:如何通过引用传递变量?

于 2012-04-26T09:49:42.723 回答
1

当我传递lastkeys给时move.mov,键不应该是一个新变量吗?

不,对象总是在 Python 中通过引用传递。如果您将一个列表传递给一个函数,并且该函数修改了该列表,那么之后从调用方可以看到修改。

于 2012-04-26T09:48:30.023 回答