这是我的意思的一个例子:
def foo():
foo = 5
print(foo + 5)
foo()
# => 10
Run Code Online (Sandbox Code Playgroud)
该代码不会产生任何错误并且运行完美。这与变量和函数不应具有相同名称(除非覆盖它们)的想法相矛盾。为什么它有效?当应用于实际代码时,我应该使用不同的函数/局部变量名称,还是这完全没问题?
khe*_*ood 54
foo = 5
在函数内创建一个局部变量。def foo
创建一个全局变量。这就是为什么他们可以有相同的名字。
foo
如果您在函数内部引用foo()
,则指的是局部变量。如果您引用foo
该函数的外部,则指的是全局变量。
由于它显然会给尝试遵循代码的人造成混乱,因此您可能不应该这样做。
Quu*_*one 30
其他人还没有提到过:Python 是一种动态语言,几乎没有静态检查。所以当你写的时候
\ndef foo():\n foo = 5\n print(foo + 5)\n
Run Code Online (Sandbox Code Playgroud)\n你可能一直认为这是一个“矛盾” \xe2\x80\x94 如何foo
同时是一个函数和一个整数变量?第一阶答案是“这是两个不同的foo
s”,因为内部foo
只是一个局部变量,与全局名称无关foo
。但是将其设为全局,代码仍然有效!
def foo():\n global foo\n foo = 5\n print(foo + 5)\n\nfoo() # OK, prints 10\n
Run Code Online (Sandbox Code Playgroud)\n这段代码中只有一个foo
!然而,它并不是“既是变量又是函数”。首先,在第 1\xe2\x80\x934 行,我们定义foo
为具有特定主体 \xe2\x80\x94 的函数,但我们尚未执行该主体。第 4 行之后,全局foo
保存了一个函数。然后,在第 6 行,我们实际上调用了 引用的函数foo
,该函数执行其主体。主体所做的第一件事是分配5
给foo
...,现在 foo
保存一个整数。通过运行为 分配新值的代码foo
,我们更改了foo
的值。它曾经是那个功能;现在是 5。在像 Python 这样的动态类型语言中,这没有什么问题。
def foo():\n global foo\n foo = 5\n print(foo + 5)\n\nfoo() # OK, prints 10 (and incidentally assigns a new value to foo)\nfoo() # Raises TypeError: 'int' object is not callable\n
Run Code Online (Sandbox Code Playgroud)\n
小智 11
答案是肯定的。函数是 Python 中的第一类对象。foo
函数和变量之间没有根本区别foo
。它们都是对内存的引用,并且都有作用域,因此它们都相当于变量。如果您将 foo 定义为函数,然后不在本地覆盖它,它将像一个全局变量(取自上层作用域):
def foo():
print(foo)
Run Code Online (Sandbox Code Playgroud)
然后如果你用局部变量覆盖它,它只会在函数作用域内定义一个局部变量:
def foo():
foo = 3
print(foo)
Run Code Online (Sandbox Code Playgroud)
在Python中,每个引用(变量)都可以在特定范围的生命周期内被覆盖。你可以试试:
def foo(): pass
foo = 3
Run Code Online (Sandbox Code Playgroud)
这将覆盖 foo 的值,并且它现在将指向 3 而不是内存中的函数 foo 。