【问题标题】:is the variable passed as a pointer for some reason?变量是否由于某种原因作为指针传递?
【发布时间】:2012-04-26 09:38:18
【问题描述】:

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

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

【问题讨论】:

  • Python: How do I pass a variable by reference? 的可能重复项(我知道这与您所问的几乎完全相反,但答案是相关的,更重要的是,每次问这个问题时(大约 5一天次)在 SO 上,它会从不知道赋值和变异对象之间的区别,或者名称和变量之间的区别的人那里产生大量的虚假信息,所以......

标签: python function pointers reference module


【解决方案1】:

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

>>> 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]

更深入的讨论请见:How do I pass a variable by reference?

【讨论】:

  • 所有对象通过引用传递。但是对于不可变的,没关系......
  • 如何不通过引用传递?
  • 我还是不明白,如果我做 bar = 0 然后 def foo(bar):bar+=1 那么 bar 仍然是 0
  • 不传递对象,传递对象的引用 - 按值
  • @FerdinandBeyer:嗯,不。甚至没有关闭。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2011-10-12
    • 2012-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 2020-11-07
    相关资源
    最近更新 更多