我有一个问题。让我们假设我们有函数hello()。用括号和没有括号调用它有什么区别?当我调用hello()时,它指的是一个值等于此函数的对象。或许我错了?如果我在没有括号的情况下调用它会发生什么?
我想知道为什么
def hello():
pass
print(id(hello))
print(id(hello()))
返回不同的结果
4400606744
4398942536
答案 0 :(得分:4)
简短回答:请参阅https://nedbatchelder.com/text/names.html以更好地了解对象与用于引用对象的名称之间的区别。
如果使用括号,则调用函数if和 。 hello()
调用该函数; hello
只是绑定到函数的名称,例如,可用于将函数对象作为参数传递给另一个函数。
def caller(f):
f()
def hello():
print("hi")
def goodbye():
print("bye")
caller(hello) # Prints "hi"
caller(goodbye) # Prints "bye"
关于您的更新,id
返回不同的值,因为每次调用id
都会收到一个完全独立的对象作为其参数。使用id(hello)
,id
获取函数对象本身。使用id(hello())
,id
通过调用hello
获取对象返回;它与
x = hello()
print(id(x))
答案 1 :(得分:2)
TL; DR :括号执行函数本身;如果没有它们,你会将函数视为变量
在python中,如果要调用,则将括号(内置可选变量)附加到函数名 。
但是还有另一种使用函数名的方法。 实际上,在python函数中是第一类对象,这意味着函数可以像传递名称那样传递。为此,您不得在函数名末尾添加括号()。
检查以下内容:
def f():
return 'f'
print( type(f) ) # result: <class 'function'>
print( type(f()) ) # result: <class 'str'>
如您所见,在第一个实例中,我们打印f的类型(没有括号),这是一个函数
在第二个实例中,我们打印f()(带括号)的类型,它是一个字符串,它是f调用时返回的类型。
此行为对于将函数作为其他函数等的参数传递非常有用。
id()和id(函数调用&gt;)返回不同的id:
print(id(hello)) # here it returns the id of the function name
print(id(hello())) # here it returns the id
# of the object returned by the function itself
答案 2 :(得分:1)
hello是指函数对象,hello()调用函数本身。
例如:
>>> def hello():
... print "hello"
...
>>> hello
<function hello at 0x106c91398>
>>> hello()
hello
答案 3 :(得分:0)
函数是一个对象,就像Python中的任何其他对象一样。如果定义新函数,则会创建一个新的函数对象并将其分配给函数的名称。
def spam():
print('The knights who say Ni!')
print(spam) # => <function spam at 0x7fc64efc6f28>
spam() # => output: 'The knights who say Ni!
正如您在定义函数后所看到的那样,它被赋予了spam
的名称。它基本上类似于正在运行的赋值语句。现在该名称将为您提供访问,但为了实际使用它,您必须使用spam()
等括号调用。如果不使用括号调用它,它将只返回已分配给名称spam
的函数对象。
答案 4 :(得分:0)
简而言之,带有括号()
的函数实际上是在调用(调用)该函数,而没有括号()
的函数是该对象的对象可以作为参数传递的函数,以后可以通过在其后面附加()
来调用。
def hello():
return 1
即
hello
>>返回对象
hello()
>>输出1