下面是我的一个例子:
def foo():
foo = 5
print(foo + 5)
foo()
# => 10该代码不会产生任何错误并完美地运行。这与这样的观点相矛盾,即变量和函数不应该有相同的名称,除非重写它们。为什么要工作?,当应用于实际代码时,我应该使用不同的函数/局部变量名,还是完全正确?
发布于 2021-12-16 10:38:35
foo = 5在函数中创建一个局部变量。def foo创建一个全局变量。这就是为什么他们可以有相同的名字。
如果在foo函数中引用foo(),则引用局部变量。如果您引用该函数之外的foo,则指的是全局变量。
因为它显然会给试图遵循代码的人造成混乱,所以您可能不应该这样做。
发布于 2021-12-17 01:39:45
其他人还没有提到: Python是一种动态语言,很少进行静态检查。所以当你写
def foo():
foo = 5
print(foo + 5)你可能一直认为这是一个“矛盾”-- foo怎么能同时成为一个函数和一个整数变量?一阶答案是“这是两个不同的foo”,因为内部foo只是一个局部变量,与全局名称foo无关。但是让它成为全球性的,并且代码仍然有效!
def foo():
global foo
foo = 5
print(foo + 5)
foo() # OK, prints 10在这段代码中只有一个foo!然而,它不是“一个变量和一个函数”。首先,在第1-4行中,我们将foo定义为一个具有特定主体的函数,但我们尚未执行该主体。在第4行之后,全局foo包含一个函数。然后,在第6行中,我们实际上调用了foo引用的函数,它执行它的主体。身体做的第一件事就是把5分配给foo.现在,foo持有一个整数。通过运行为foo分配一个新值的代码,我们改变了foo的值。它以前是那个函数,现在是5。在像Python这样的动态类型语言中,这没有什么问题。
def foo():
global foo
foo = 5
print(foo + 5)
foo() # OK, prints 10 (and incidentally assigns a new value to foo)
foo() # Raises TypeError: 'int' object is not callable发布于 2021-12-16 10:44:50
答案是肯定的。函数是Python中的一级对象。foo函数与foo变量之间没有根本区别。这两个都是对内存的引用,并且都有一个作用域,因此它们都等价于一个变量。如果您已经将foo定义为一个函数,并且没有在本地覆盖它,那么它将类似于一个全局变量(取自上层范围):
def foo():
print(foo)然后,如果用局部变量覆盖它,它将只在函数范围内定义一个局部变量:
def foo():
foo = 3
print(foo)在Python中,每个引用(变量)都可以覆盖特定范围的生存期。你可以试试:
def foo(): pass
foo = 3这将覆盖foo的值,现在它将指向3,而不是内存中的foo函数。
https://stackoverflow.com/questions/70377512
复制相似问题