Python如何在另一个函数中使用局部变量作为参数

时间:2014-02-19 19:57:58

标签: python function local-variables

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

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()的局部变量。所以,我需要知道如何在函数updateFish中使用addFish()中的变量作为参数。

我正在建造一个鱼缸,让鱼连续不断地反弹,但是我需要updateFish功能来处理我添加的所有鱼 - 因此它需要是函数中的参数。

2 个答案:

答案 0 :(得分: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方法可能很适合班级。

答案 1 :(得分:0)

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

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

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