0

作成したコードは機能しますが、その理由を知りたいです。うっかりコードを間違えてしまったのですが、なぜか動くのですがなぜでしょうか?に渡すとき、キーは新しい変数lastkeysmove.movあるべきではありませんか? と同じで、新しい変数にするべきent.playerlocationではありませんか? 関数を終了すると、元の変数が新しい変数の値に変更されます。これを再現しようとしましたが、できませんでした。playermove.mov

main.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)

move.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

に渡すとき、キーは新しい変数lastkeysmove.movあるべきではありませんか?

いいえ、Python ではオブジェクトは常に参照によって渡されます。リストを関数に渡し、関数がリストを変更する場合、変更は後で呼び出し側から表示されます。

于 2012-04-26T09:48:30.023 に答える