为啥我的函数使用局部变量而不是全局变量? [复制]

Posted

技术标签:

【中文标题】为啥我的函数使用局部变量而不是全局变量? [复制]【英文标题】:Why does my function use the local variable instead of the global? [duplicate]为什么我的函数使用局部变量而不是全局变量? [复制] 【发布时间】:2021-06-20 17:29:56 【问题描述】:

所以做了一个简单的例子来帮助自己更好地理解范围。

据我了解,函数中的变量仅对该函数是本地的。如果要使用函数外部的变量,该变量与函数内的局部变量同名,则可以使用 global 关键字,它告诉函数忽略具有该名称的任何局部变量并仅使用全局变量。

所以这个程序应该首先打印全局变量的值,然后调用函数并再次打印全局变量,因为它应该忽略局部变量,但无论如何它都会打印局部变量。 Python 导师告诉我它完全跳过了全局语句。

 cheese = 99
    
    
    def func():
        global cheese
        cheese = 100
        print(f"Global cheese is cheese")
    
    
    
    print(f"Global cheese is cheese")
    func()

输出:

全球奶酪是 99

全球奶酪是 100

然后当我在 print 语句之前调用函数时,变量被更改为局部变量的值..这是为什么?

cheese = 99


def func():
    global cheese
    cheese = 100
    print(f"Global cheese is cheese")



func()
print(f"Global cheese is cheese")

输出:

全球奶酪是 100

全球奶酪是 100

【问题讨论】:

什么局部变量?你没有。 要么你误读了 Python 导师的事情,要么 Python 导师的事情是错误的。这里没有局部变量。 不,您要分配给全局,因为同一函数中有 global cheese 您对 global 所做的事情的理解 - “如果您想使用函数外部的变量,该变量与函数内的局部变量同名,您可以使用 global 关键字告诉你的函数忽略任何具有该名称的局部变量,只使用全局变量。” - 是错的。 global 不会让 Python 忽略局部变量。如果您在函数中使用global cheese,则该函数根本没有cheese 局部变量。没有可忽略的局部变量。 “然后调用该函数并再次打印全局变量,因为它应该忽略局部变量,但无论如何它都会打印局部变量”。不,它会打印全局变量,因为 没有 局部变量。即使您刚刚写了cheese = 100,您似乎仍然希望它仍然向您显示99,因为您希望它与全局cheese 分开。 global 语句的整点是使它成为一个单独的cheese 【参考方案1】:

当您的函数运行时,它使用全局 cheese 变量而不是您提到的局部 cheese 变量。

因此,当您的函数运行cheese = 100 语句时,它指的是您在程序开头声明的全局cheese 变量。该语句不会创建新的本地 cheese 变量。

因此,运行func() 会将全局变量更新为100

【讨论】:

【参考方案2】:

global 关键字用于在函数内部创建全局变量

在您尝试编写 global cheese 的情况下,它会重新创建一个名为 cheese 的全局变量,您将其赋值为 100。因此它会忽略先前创建的值为 99 的 cheese 变量

here 是对全局关键字的更好解释

【讨论】:

【参考方案3】:

但是您声明要在函数中使用全局变量。因此,当您分配一个值时,它会更改全局变量。

cheese = 99
    
    
def func():
  global cheese # Declares that you want to use global cheese variable
  cheese = 100  # This updates the global cheese variable
  print(f"func() cheese is cheese")
    
def local_func():
  cheese = 101
  print(f"local_func() cheese is cheese")


print(f"Global cheese is cheese")        
func()
print(f"Global cheese is cheese")
local_func()
print(f"Global cheese is cheese")

结果是:

Global cheese is 99
func() cheese is 100
Global cheese is 100
local_func() cheese is 101
Global cheese is 100

【讨论】:

以上是关于为啥我的函数使用局部变量而不是全局变量? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

局部变量和全局变量的区别

为啥你可以在函数中使用另一种方法而不是赋值运算符来更改 Ruby 中局部变量的值?

为啥typescript不能直接引用第三方js库的全局变量?

全局变量与局部变量的性能

C++ - 21局部变量和全局变量的区别

C++ - 21局部变量和全局变量的区别