这两种传递参数的方式有什么区别?

Say*_*iss 23 python

在Python中,这两个例子做了同样的事情:

from tkinter import Label
widget = Label(None, text='Hello')
widget.pack()
widget.mainloop()

from tkinter import Label
widget = Label(None,'Hello')
widget.pack()
widget.mainloop()
Run Code Online (Sandbox Code Playgroud)

我认为Label是一个类,当我尝试创建该类的实例时,我总是做与上一个代码示例相同的事情.我觉得这个意思很奇怪text='Hello'.有人可以告诉我这件事吗?

Ash*_*ary 43

text='Hello'表示您将值显式传递'Hello'给函数参数中的关键字 text参数.

Label(None,'Hello')means 'Hello'被传递给函数定义中的第二个位置参数(无论该变量的名称是什么)

>>> def func(first, second):
...     print first, second
...     
>>> func('foo', 'text')
foo text
>>> func('foo', second = 'text')
foo text
Run Code Online (Sandbox Code Playgroud)

使用关键字参数调用的顺序无关紧要,但所有关键字参数必须在位置参数之后.

>>> def func(first, second, third):
    print first, second, third
...     
>>> func('foo', third = 'spam', second = 'bar')
foo bar spam
Run Code Online (Sandbox Code Playgroud)

这里first获得的价值'foo',因为它的位置,而secondthird得到了他们的价值,因为他们被明确地使用他们的名字通过这些值.

有关详细信息,请阅读文档:http://docs.python.org/3/tutorial/controlflow.html#more-on-defining-functions

  • + 1在其他语言中也称为"命名参数关联". (5认同)

And*_*ter 14

我对text ='Hello'的含义感到奇怪.有人可以告诉我这件事吗?

它是一个命名参数关键字参数.

命名参数允许以任何顺序将参数传递给函数,不仅传递参数值,还传递参数名称.


Rub*_*ens 7

正如其他人所说,这是一个keyword argument.实际上,指定或不指定参数之间的区别仅仅是使用哪个参数.

例如,如果你有一个带有3个参数的函数,并且只传递了一个或两个参数,那么你必须指定你使用的参数,以防它们不是你定义中的第一个参数.

def f(a = "a", b = "b", c = "c"):
    print a, b, c

>>> f("x")
x b c
>>> f("x", "y")
x y c
>>> f("x", c = "y")
x b y
Run Code Online (Sandbox Code Playgroud)


bba*_*les 6

text在这种情况下是一个关键字参数,这意味着它是可选的.如果您未明确提供,则会自动提供默认值.