0

我只是在学习 Python 的工作原理,在阅读了一段时间后,我仍然对全局变量和正确的函数参数感到困惑。考虑 case 全局变量在函数内部没有被修改,只被引用。

可以使用全局变量代替函数参数吗?我听说使用全局变量被认为是一种不好的做法。在这种情况下会是这样吗?

不带参数调用函数:

def myfunc() :
    print myvalue

myvalue = 1
myfunc()

带参数调用函数

def myfunc(arg) :
    print arg

myvalue = 1
myfunc(myvalue)
4

4 回答 4

2

我听说使用全局变量被认为是一种不好的做法。在这种情况下会是这样吗?

这取决于您要达到的目标。如果myfunc()应该打印任何值,那么...

def myfunc(arg):
    print arg

myfunc(1)

...更好,但如果myfunc()应该始终打印相同的值,那么...

myvalue = 1

def myfunc():
    print myvalue

myfunc()

...更好,尽管有一个如此简单的示例,您也可以将全局因素考虑在内,然后使用...

def myfunc():
    print 1

myfunc()
于 2013-04-25T12:13:19.997 回答
0

是的。在这些情况下,使变量global有效,而不是将它们作为函数参数传递。但是,问题是一旦你开始编写更大的函数,你很快就会用完名字,而且很难维护全局定义的变量。如果您不需要编辑变量而只想读取它,则无需global在函数中定义它。

在此处阅读有关全局变量的缺点 -全局变量是否不好?

于 2013-04-25T12:08:48.577 回答
0

这取决于你想做什么。

如果您需要更改在函数外部声明的变量的值,则不能将其作为参数传递,因为这会在函数范围内创建该变量的“副本”。
但是,如果您只想使用变量的值,则应将其作为参数传递。这样做的好处是你不能不小心弄乱全局变量。

此外,您应该在使用全局变量之前声明它们。

于 2013-04-25T12:11:48.743 回答
0

使用函数参数比使用全局变量更好的原因有以下几个:

  1. 它消除了可能的混淆:一旦您的程序变大,就很难跟踪在哪里使用了哪个全局变量。传递函数参数可以让您更清楚地了解函数使用哪些值。
  2. 如果你使用全局变量,你最终会犯一个特别的错误,在你理解发生了什么之前,这看起来很奇怪。它与修改和读取同一函数中的全局变量有关。稍后再谈。
  3. 全局变量都存在于同一个命名空间中,因此您很快就会遇到名称重叠的问题。如果你想要两个不同的名为“index”的变量怎么办?打电话给他们会变得非常混乱,非常快index1index2使用局部变量,或函数参数,意味着它们都存在于不同的命名空间中,混淆的可能性大大降低。

现在,我提到了在同一个函数中修改和读取全局变量,以及可能导致的令人困惑的错误。这是它的样子:

record_count = 0  # Global variable
def func():
    print "Record count:", record_count
    # Do something, maybe read a record from a database
    record_count = record_count + 1  # Would normally use += 1 here, but it's easier to see what's happening with the "n = n + 1" syntax

这将失败:UnboundLocalError: local variable 'record_count' referenced before assignment

等等,什么?当它显然是全局变量时,为什么record_count被视为局部变量?好吧,如果你从未在函数中赋值record_count那么 Python 将使用全局变量。但是当你给 赋值时record_count,Python 不得不猜测你的意思:是要修改全局变量,还是要创建一个新的局部变量来隐藏(隐藏)全局变量,并且只处理局部变量多变的。Python 会默认假设你对全局变量很聪明(即,在不知道你在做什么和为什么的情况下不修改它们,并假设你打算创建一个名为record_count.

但是,如果您要访问record_count函数内部命名的局部变量,Python 将不允许您访问函数内部具有相同名称的全局变量。这是为了避免一些非常讨厌的、难以追踪的错误。这意味着如果这个函数有一个名为的局部变量record_count——并且由于赋值语句而确实如此——那么所有访问都record_count被认为是访问局部变量。包括语句中的访问print,在定义局部变量的值之前。因此,UnboundLocalError例外。

现在,给读者做一个练习。删除 print 语句并注意仍然抛出异常UnboundLocalError。你能弄清楚为什么吗?(提示:在分配给变量之前,必须计算分配右侧的值。)

现在:如果你真的record_count在你的函数中使用全局变量,这样做的方法是使用 Python 的global语句,它说“嘿,我要指定这个变量名?永远不要让它成为局部变量,即使我分配给它。而是分配给全局变量。” 它的工作方式只是global record_count(或任何其他变量名),位于函数的开头。因此:

record_count = 0  # Global variable
def func():
    global record_count
    print "Record count:", record_count
    # Do something, maybe read a record from a database
    record_count = record_count + 1  # Again, you would normally use += 1 here

这将首先满足您的期望。但希望现在你明白为什么它会起作用,而另一个版本不会。

于 2013-04-25T12:31:20.937 回答