默认情况下是Python变量全局

Are Python variables global by default?

本文关键字:变量 全局 Python 情况下 默认      更新时间:2023-10-16

请在python中考虑以下代码:

a = 10
def fun():
    print(a)
fun()

这在ipython笔记本中正常工作,输出为 10

在C 中考虑此代码:

#include <iostream>
void fun()  {
    std::cout << a << std::endl;
}
int main()  {
    int a = 10;
    fun();
    return 0;
}

编译时,错误是:

compare-fun.cpp: In function ‘void fun()’:
compare-fun.cpp:4:18: error: ‘a’ was not declared in this scope
     std::cout << a << std::endl;

我对Python代码感到困惑,为什么即使在fun中未定义a

与您的C 代码相同的Python代码实际上是:

def fun():
    print(a)
def main():
    a = 10
    fun()
if __name__ == '__main__':
    main()

运行时,会产生以下内容:

Traceback (most recent call last):
  File "test1.py", line 9, in <module>
    main()
  File "test1.py", line 6, in main
    fun()
  File "test1.py", line 2, in fun
    print(a)
NameError: global name 'a' is not defined

等效的C 代码与您的Python代码是:

#include <iostream>
int a = 10;
void fun()  {
    std::cout << a << std::endl;
}
int main()  {
    fun();
    return 0;
}

运行时,输出10

在Python中,所有对象均被同等处理。您可以说这是或不是一个好的设计决定,但这就是它的样子(并且很可能总是这样),所以让我们接受作为公理。

让我们看一些python 应该支持的代码:

def bar(val):
    return val + 6
def foo(a):
    return bar(a * 2)

我们希望bar在函数foo中可用,但是为了允许,我们需要允许在范围层次结构中较高级别定义的任何其他对象,也可以可用,因为我们希望平等地对待所有对象。

def add_constant(constant):
    def add(value):
        return value + constant
    return add
add_3 = add_constant(3)
assert add_3(6) == 9

还请注意,以下是一个错误(并且更像您发布的C 代码):

def func():
    print a
def main():
    a = 10
    func()  # NameError!
if __name__ == '__main__':
    main()

这不起作用的原因是func的范围无法访问定义a的范围(main),因为func的范围不是main的范围的孩子。/p>

这两个代码不是等效的。

在python中,您在全局范围中定义了变量,在C 中不定义变量。如果将C 的代码更改为此,则应以类似的方式工作:

#include <iostream>
int a = 10;
void fun()  {
    std::cout << a << std::endl;
}
int main()  {
    fun();
    return 0;
}

要了解有关Python中的范围的更多信息。

在文件主体主体中定义的变量称为 全局变量。它将在整个文件中可见,也将 在任何导入该文件的文件中。全球变量可以具有 意想不到的后果由于其广泛的影响 - 这就是为什么我们几乎不应该使用它们的原因。只有对象 打算在全球使用,例如功能和类,应该是 放入全局名称空间。

C

中的概念非常相似

范围是该计划的一个地区,从广义上讲 三个地方,可以声明变量 -

在函数或一个称为局部变量的块中,

在函数参数的定义中,称为正式 参数。

在所有函数之外,称为全局变量。

在您的python示例中,您可以 use (不调用) a fun()中的 CC_13,因为 a在全局范围中定义了。这意味着a在整个程序中都可以访问。

但是,正如Ignacio在评论中已经告诉您的那样,您的两个示例并非同等。在您的C 示例中,a不是在全局范围中定义的,而是在main()的范围中定义。这意味着void fun()无法知道a0在何处的定义,因此丢弃了错误。如果您在全局范围中定义了a,则您的C 示例可以正常工作:

#include <iostream>
int a = 10;
void fun()  {
    std::cout << a << std::endl;
}
int main()  {
    fun();
    return 0;
}

这就是为什么您的C 示例引发错误的原因,而您的Python示例则没有。您在示波器void fun()内定义了a,对此一无所知。正如其他人已经显示的那样,在您的原始C 示例中创建等效代码也会引起错误。

python变量的范围由定义的位置确定。如果已在函数或类之外定义了变量,则它是全局的。否则,除非声明为 global,否则它是本地的。有关此主题的更多信息:http://www.python-course.eu/python3_global_vs_local_variables.php

a是一个全局变量,因此您可以在过程中使用它。