2014-02-19 57 views
1

我需要使用一个函数中创建的变量作为另一个函数中的参数/参数。我不确定如何在没有连续的错误信号的情况下这样做,因为我每10毫秒重复一次该功能。这里是代码:Python如何在另一个函数中使用局部变量作为参数

def addFish(): 
    x = createRandomX() 
    y = createRandomY() 
    Dx = createRandomDx() 
    Dy = createRandomDy() 
    fish = canvas.create_image(x, y, image = fishRight) 
    updateFish(x, y, Dx, Dy, fish) 
    return x, y, Dx, Dy, fish 


fishButton = Button(root, text = "Add a fish", command = addFish) 
fishButton.grid(row = 1, column = 0) 



def updateFish(x, y, Dx, Dy, fish): 
    #global x, y, Dx, Dy, fish 
    canvas.coords(fish, x , y) 
    x = x + Dx 
    y = y + Dy 

    if x < 0 or x > 500: 
     Dx = Dx * -1 
    if y < 0 or y > 500: 
     Dy = Dy * -1 
    if Dx == 1: 
     canvas.itemconfig(fish, image=fishRight) 
    if Dx == -1: 
     canvas.itemconfig(fish, image=fishLeft) 

    canvas.after(10, updateFish(x, y, Dx, Dy, fish)) 


updateFish(x, y, Dx, Dy, fish) 

root.mainloop() 

所以,当我这样做时,我得到的错误,没有定义x。这是因为当我调用updateFish时,第一个参数x不是全局变量,它只是addFish()的局部变量。所以,我需要知道如何能够使用addFish()中的变量作为函数updateFish中的参数。

我正在建造一个鱼类,让鱼不断反弹,但我需要updateFish函数来为我添加的所有鱼类工作 - 因此它需要是函数中的一个参数。

+0

当你调用'updateFish'时,你期望'x'的值是什么? – BrenBarn

+0

我希望它与我在创建一条鱼时创建的随机x相同。我想在随机位置创建一条鱼,然后将该位置发送给更新鱼,以便它可以移动。在updateFish开始时我只需要一次这个位置,因为一旦它进入更新鱼,x和y值将会随着时间的推移而开始改变,这样鱼就会四处移动。 – user3329772

+0

在您第一次调用'updateFish'时,您从未称过'addFish',因此没有创建鱼。 – BrenBarn

回答

1

的问题是,所有的值按值传递的,所以你的函数内更改它们将不会更新从函数调用原始变量:

>>> def test (x): 
     x = x * 10 
>>> x = 20 
>>> test(x) 
>>> x 
20 

如果你想保持状态,多鱼,我建议你创建一个鱼型:

class Fish (object): 
    def __init__ (self, x, y, dx, dy, canvas): 
     self.x = x 
     self.y = y 
     self.dx = dx 
     self.dy = dy 
     self.canvas = canvas 
     self.image = canvas.create_image(x, y, image=fishRight) 

然后,您可以创建使用Fish(x, y, dx, dy, canvas)一条鱼,只有一个对象,你可以通过引用传递。然后更改该对象的值将更新全局值。

然后,您也可以将类中的某些函数作为方法移动。例如。 updateFish方法可能适合在课堂上使用。

+0

感谢您的帮助。我正在开始Python课程,所以我怀疑这将是考虑到我以前没有看到过它的方式。有没有办法做到这一点,它使用了我目前在那里的大多数概念? – user3329772

0

您是否知道closures?在封闭函数fooMamafoo内定义foo可以访问所有fooMama的局部变量,即使在fooMama返回后也是如此。

更好的解释:https://stackoverflow.com/a/4020443/2037637

[编辑]我知道这并没有真正回答你的问题,但它至少可能会有所帮助。

相关问题