首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >函数和局部变量可以有相同的名称吗?

函数和局部变量可以有相同的名称吗?
EN

Stack Overflow用户
提问于 2021-12-16 10:34:55
回答 7查看 5.6K关注 0票数 47

下面是我的一个例子:

代码语言:javascript
复制
def foo():
    foo = 5
    print(foo + 5)

foo()
# => 10

该代码不会产生任何错误并完美地运行。这与这样的观点相矛盾,即变量和函数不应该有相同的名称,除非重写它们。为什么要工作?,当应用于实际代码时,我应该使用不同的函数/局部变量名,还是完全正确?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2021-12-16 10:38:35

foo = 5在函数中创建一个局部变量。def foo创建一个全局变量。这就是为什么他们可以有相同的名字。

如果在foo函数中引用foo(),则引用局部变量。如果您引用该函数之外的foo,则指的是全局变量。

因为它显然会给试图遵循代码的人造成混乱,所以您可能不应该这样做。

票数 54
EN

Stack Overflow用户

发布于 2021-12-17 01:39:45

其他人还没有提到: Python是一种动态语言,很少进行静态检查。所以当你写

代码语言:javascript
复制
def foo():
    foo = 5
    print(foo + 5)

你可能一直认为这是一个“矛盾”-- foo怎么能同时成为一个函数和一个整数变量?一阶答案是“这是两个不同的foo”,因为内部foo只是一个局部变量,与全局名称foo无关。但是让它成为全球性的,并且代码仍然有效!

代码语言:javascript
复制
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这样的动态类型语言中,这没有什么问题。

代码语言:javascript
复制
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
票数 30
EN

Stack Overflow用户

发布于 2021-12-16 10:44:50

答案是肯定的。函数是Python中的一级对象。foo函数与foo变量之间没有根本区别。这两个都是对内存的引用,并且都有一个作用域,因此它们都等价于一个变量。如果您已经将foo定义为一个函数,并且没有在本地覆盖它,那么它将类似于一个全局变量(取自上层范围):

代码语言:javascript
复制
def foo():
  print(foo)

然后,如果用局部变量覆盖它,它将只在函数范围内定义一个局部变量:

代码语言:javascript
复制
def foo():
  foo = 3
  print(foo)

在Python中,每个引用(变量)都可以覆盖特定范围的生存期。你可以试试:

代码语言:javascript
复制
def foo(): pass
foo = 3

这将覆盖foo的值,现在它将指向3,而不是内存中的foo函数。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70377512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档