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

标签 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() 的局部变量。因此,我需要知道如何能够使用 addFish() 中的变量作为函数 updateFish 中的参数。

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

最佳答案

问题是所有值都是按值传递的,因此在函数中更改它们不会更新函数调用中的原始变量:

>>> 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 方法可能很适合该类。

关于Python如何在另一个函数中使用局部变量作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21891042/

相关文章:

python - 更新中间文件时防止规则重新运行

python - Visual Studio Code Unresolved 导入 `sys`、 `time`、 `errno`

python - 使用 pip 下载的文件存储在 virtualenv 中的哪里?

c++ - boost::multi_index 通过带参数的函数调用索引

vba - 从VBA中的函数返回数组

objective-c - 返回前释放局部变量?

c++ - 如何使用指针从不同的函数访问局部变量?

python - 如何为以下情况定义查询过滤器?

mysql - 如何在mysql中为预先插入的记录插入唯一的id

java - 在ArrayBlockingQueue中,为什么将final成员字段复制到本地final变量中?