在python中考虑以下代码:
a = 10
def fun():
print(a)
fun()
这在ipython notebook中运行良好,输出为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代码感到困惑,为什么即使a
中没有定义a
,它也会调用fun
?
答案 0 :(得分:9)
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
Python代码的等效C ++代码是:
#include <iostream>
int a = 10;
void fun() {
std::cout << a << std::endl;
}
int main() {
fun();
return 0;
}
运行时,输出10
。
答案 1 :(得分:4)
在python中,所有对象都被平等对待。你可以说这是一个或者不是一个好的设计决定,但它就是这样(也可能是它总是如此)所以让我们接受它作为一个公理。
让我们看一下python 应想要支持的代码:
def bar(val):
return val + 6
def foo(a):
return bar(a * 2)
我们希望bar
在函数foo
中可用,但为了实现这一点,我们需要允许在范围层次结构中更高级别定义的任何其他对象也可用我们希望平等对待所有对象。
另请注意,这实际上是python的非常有用的属性,因为它允许使用闭包执行有趣的事情:
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
范围的孩子。
答案 2 :(得分:1)
这两个代码不相同。
在Python中,您在全局范围内定义变量,而不是在C ++中。 如果您将C ++中的代码更改为此代码,它应该以类似的方式工作:
#include <iostream>
int a = 10;
void fun() {
std::cout << a << std::endl;
}
int main() {
fun();
return 0;
}
要了解有关Python范围的更多信息,请查看here。
中的概念非常相似在文件主体中定义的变量称为a 全局变量。它将在整个文件中可见,也是 在任何导入该文件的文件中。全局变量可以有 因其广泛的影响而产生意想不到的后果 - 那 这就是为什么我们几乎不应该使用它们。只有对象 旨在全局使用,如功能和类,应该是 放入全局命名空间。
范围是程序的一个区域,从广义上讲是有的 三个地方,可以声明变量 -
在函数或块中称为局部变量
在函数参数的定义中称为形式 参数。
在所有称为全局变量的函数之外。
答案 3 :(得分:1)
在Python示例中,您可以在函数a
中使用(而不是调用)fun()
,因为a
是在全局范围内定义的。这意味着整个计划都可以访问a
。
但正如伊格纳西奥已经在评论中告诉你的那样,你的两个例子并不等同。在您的C ++示例中,a
在全局范围内定义的不是,但在main()
的范围内。这意味着void fun()
无法知道a
的定义位置,因此会抛出错误。如果在全局范围中定义a
,那么您的C ++示例将正常工作:
#include <iostream>
int a = 10;
void fun() {
std::cout << a << std::endl;
}
int main() {
fun();
return 0;
}
这就是为什么你的C ++示例引发了错误,而你的Python示例却没有。您在范围a
内定义了void fun()
。正如其他人已经表明的那样,在Python中创建与原始C ++示例相同的代码也会引发错误。
答案 4 :(得分:0)
Python变量的范围取决于它的定义位置。如果已在函数或类之外定义变量,则它是全局变量。否则,它是本地的,除非声明global
。有关此主题的更多信息:http://www.python-course.eu/python3_global_vs_local_variables.php
答案 5 :(得分:0)
a是一个全局变量,因此您可以在过程中使用它。