函数和局部变量可以同名吗?

jia*_*hen 47 python scope

这是我的意思的一个例子:

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该函数的外部,则指的是全局变量。

由于它显然会给尝试遵循代码的人造成混乱,因此您可能不应该这样做。

  • 另外,如果你尝试使 `foo` 递归,你将会失败。`def foo(n): 如果 n > 1: foo(n-1); foo = 5` 这里对 `foo(n-1)` 的调用会将 `foo` 作为局部变量查找,即使局部变量只是稍后第一次分配...... (6认同)

Quu*_*one 30

其他人还没有提到过:Python 是一种动态语言,几乎没有静态检查。所以当你写的时候

\n
def foo():\n    foo = 5\n    print(foo + 5)\n
Run Code Online (Sandbox Code Playgroud)\n

你可能一直认为这是一个“矛盾” \xe2\x80\x94 如何foo同时是一个函数和一个整数变量?第一阶答案是“这是两个不同的foos”,因为内部foo只是一个局部变量,与全局名称无关foo。但是其设为全局,代码仍然有效!

\n
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,该函数执行其主体。主体所做的第一件事是分配5foo...,现在 foo保存一个整数。通过运行为 分配新值的代码foo,我们更改了foo的值。它曾经是那个功能;现在是 5。在像 Python 这样的动态类型语言中,这没有什么问题。

\n
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

  • 好答案。还有两个不同的“foo”的概念称为**变量阴影** - https://en.wikipedia.org/wiki/Variable_shadowing (4认同)

小智 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 。