在一个实例方法中使用的全局变量没有使用"global"关键字。

23 浏览
0 Comments

在一个实例方法中使用的全局变量没有使用"global"关键字。

我以为在Python函数内部,全局变量必须声明为全局变量。那么为什么下面的代码可以编译并且运行没有错误呢?

#!/usr/bin/env python
text = "为什么会看到这个?"
class Foo:
    def doit(self):
        print(text)
x = Foo()
x.doit()

如果可能的话,我希望能提供Python3手册的引用。

0
0 Comments

在Python 3手册中,有一段被加粗的内容解释了在实例方法中使用全局变量时不需要使用"global"关键字。这意味着尽管自由变量可能引用全局变量,但不需要声明为全局变量。

大多数情况下,我们引用的类和函数都是全局变量(或内置变量),但在调用它们之前我们并没有考虑过需要使用"global print"。

这段话的意思是,全局变量可以在实例方法中直接使用,而无需使用"global"关键字声明。这也解释了为什么在调用全局的print函数时没有使用"global"关键字。

问题的原因是,在实例方法中使用全局变量时,没有使用"global"关键字。解决方法是,在实例方法中使用全局变量时,需要在变量名前加上"global"关键字。

以下是一个示例代码,展示了问题的原因和解决方法:

count = 0  # 全局变量
class MyClass:
    def increase_count(self):
        count += 1  # 在实例方法中使用全局变量,但没有使用"global"关键字
my_object = MyClass()
my_object.increase_count()  # 报错:UnboundLocalError: local variable 'count' referenced before assignment

在上述示例代码中,我们在实例方法`increase_count`中使用了全局变量`count`,但没有使用"global"关键字进行声明。这导致在调用`increase_count`方法时,会抛出`UnboundLocalError`错误,因为Python无法在局部作用域中找到`count`变量的定义。

为了解决这个问题,我们需要在实例方法中使用全局变量时,使用"global"关键字进行声明,如下所示:

count = 0  # 全局变量
class MyClass:
    def increase_count(self):
        global count  # 使用"global"关键字声明全局变量
        count += 1
my_object = MyClass()
my_object.increase_count()  # 正常执行,全局变量count的值增加1

在上述修改后的代码中,我们在`increase_count`方法中使用了"global"关键字声明了全局变量`count`。这样,当调用`increase_count`方法时,可以正常地对全局变量`count`进行操作,并且全局变量的值会增加1。

总结起来,当在实例方法中使用全局变量时,需要使用"global"关键字进行声明,以确保可以正确访问和修改全局变量的值。

0
0 Comments

在上述内容中,描述了一个名为"Global variable used inside a instance method without 'global'"的问题。问题的出现是由于在类的实例方法中使用了全局变量,但是没有使用"global"关键字进行声明。这导致在方法内部无法修改全局变量的值。

为了解决这个问题,可以在方法内部使用"global"关键字声明全局变量,以便能够修改它的值。在修改后,全局变量的新值将反映在整个程序中。

然而,需要注意的是,使用全局变量是不被推荐的做法。更好的方式是将变量作为参数传递给函数,并返回新的值,而不是使变量在全局范围内可访问。

正确的做法是将变量封装在类中。通过在类中声明变量,可以将其封装在类的作用域内,避免了全局变量的使用。

解决这个问题的方法包括使用"global"关键字声明全局变量或将变量封装在类中。然而,推荐的做法是避免使用全局变量,而是使用函数的输入参数和返回值来处理数据。这样可以更好地封装代码,提高代码的可维护性和可读性。

0
0 Comments

在Python中,当我们在一个实例方法中使用全局变量时,不需要使用"global"关键字来指定该变量。我们可以直接访问全局变量,而不需要使用"global"。

在下面的例子中,Python首先会在类"Foo"的作用域中查找变量"text"。由于在"Foo"类中找不到变量"text",所以它会查找外层作用域。现在,它找到了变量"text",所以它使用该值来打印输出。

根据Python文档的说明,在执行过程中,至少有三个嵌套的作用域,它们的命名空间是直接可访问的:

1. 最内层的作用域首先被搜索,它包含了局部变量的名称。

2. 任何封闭函数的作用域,从最近的封闭作用域开始搜索,包含非局部但也非全局的名称。

3. 倒数第二个作用域包含当前模块的全局名称。

4. 最外层的作用域(最后搜索)是包含内置名称的命名空间。

因此,当我们在实例方法中使用全局变量时,不需要使用"global"关键字。Python会自动查找并使用正确的作用域中的变量。

0