默认情况下是Python变量全局
Are Python variables global by default?
请在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()
无法知道a
0在何处的定义,因此丢弃了错误。如果您在全局范围中定义了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是一个全局变量,因此您可以在过程中使用它。
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 当vector是tje全局变量时,c++中vector的内存管理
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 内联函数中具有内部链接的全局变量
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 全局变量 多读取器 一个写入器多线程安全?
- 如何声明一个可以在整个程序中使用的全局 2d 3d 4d .. 数组(堆版本)变量?
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 不同作用域中的静态变量和全局变量
- 如何使用 llvm-10 库在C++定义 LLVM 全局值变量?
- C++ 在编译时具有函数计算全局变量
- 修改程序的入口点时未调用全局变量的构造函数
- 使用 std::ios_base::Init 正确初始化全局变量
- 为什么我的全局变量似乎没有变化?
- C ++程序如何返回我的数组或写入全局变量
- 为什么我的数组值与此处的全局变量不匹配?
- QT C++中对全局变量的未定义引用
- 跨多个类的全局变量而不会出现重定义错误?
- 在.cpp文件之间传递全局字符串变量?
- 默认情况下是Python变量全局