Python 以下参数在以下代码中的用途是什么?

Python 以下参数在以下代码中的用途是什么?,python,Python,我正在学习python,来自Java背景。首先,我是在Coursera上做的。在解决实践问题时,我遇到了这个特殊的代码 import simplegui message = "Welcome!" # Handler for mouse click def click(): global message message = "Good job!" # Handler to draw on canvas def draw(canvas): canvas.draw_tex

我正在学习python,来自Java背景。首先,我是在Coursera上做的。在解决实践问题时,我遇到了这个特殊的代码

import simplegui

message = "Welcome!"

# Handler for mouse click
def click():
    global message
    message = "Good job!"

# Handler to draw on canvas
def draw(canvas):
    canvas.draw_text(message, [50,112], 36, "Red")

# Create a frame and assign callbacks to event handlers
frame = simplegui.create_frame("Home", 300, 200)
frame.add_button("Click me", click)
frame.set_draw_handler(draw)

# Start the frame animation
frame.start()
现在我的问题是关于这个特殊的方法

 def draw(canvas):
    canvas.draw_text(message, [50,112], 36, "Red")
在这个方法中,为什么我需要使用特定的参数“canvas”。为什么我不能像这样简单的做

 def draw():
    canvas.draw_text(message, [50,112], 36, "Red")
因为从调用这个方法的位置看

frame.set_draw_handler(draw)
无论如何,我没有传递任何参数。所以参数的类型不存在。或者,当我从方法集\u draw\u handler()调用它时。编译器自动假定它是canvas类型

多谢各位
:)

您没有传入对draw函数的调用,而是传入函数本身。这是一个回调:您给库一个函数,库在需要做某事时(在本例中,当它需要重画窗口时)调用它。为了使回调能够工作,它需要从库中以
canvas
参数的形式输入一些内容,因此库在调用函数时会传入这些内容。

Python是动态键入的,因此编译器不采用类型。@EthanK是的,但为什么我不首先在方法调用中传递参数时需要使用参数?不必这样。Python是一种解释语言。此外,函数是一级对象。您正在将draw函数传递给set_draw_handler。但是编译器告诉我,当我尝试在没有param的情况下执行时,我没有定义它,就像java int I=0;我是全局定义的吗?那么你的意思是说参数传递是在内部处理的?我可以通过全局声明canvas而不是像java int I=0中那样作为param函数来实现吗???@Pritish否,
canvas
不是你要声明的,它来自库<代码>帧。设置绘制处理程序(draw)说明“当需要绘制
时,调用
绘制
,传入与
关联的画布,以便
绘制
知道在哪里绘制”。