Python和C++;?

Python和C++;?,python,c++,scope,Python,C++,Scope,我对Python的可变范围有点困惑。也许因为习惯了C++的约定,所以我总是在Python的变量范围内犯了一些错误。例如: 在C++中: int main(){ int i = 3; for (int j = 0; j <= 3; ++j){ i += 1; } cout << "i = " << i << endl; cout << "j = " << j <<

我对Python的可变范围有点困惑。也许因为习惯了C++的约定,所以我总是在Python的变量范围内犯了一些错误。例如:

在C++中:

int main(){
    int i = 3;
    for (int j = 0; j <= 3; ++j){
        i += 1;
    }
    cout << "i = " << i << endl;
    cout << "j = " << j << endl; //Error, out of 'for' scoping.
    return 0;
}

这只是一个简单的例子,我不打算列出其他区别。请任何人详细解释一下它们在作用域上的差异。

Python只区分两个变量作用域-局部和全局

全局变量与C/C++中的相同,即它是全局可访问的,并在函数调用之间保持其值

局部变量是函数的局部变量(类似于JavaScript)。内部块内的任何修改都会修改整个函数范围内的变量


编辑:多亏了这些评论,我忘记了非本地的声明。这允许从内部函数引用到封闭函数中的变量,请检查解释。但是,它仍然不允许将变量的范围限制在特定的块中。

Python不提供块范围。变量的最小作用域是函数(就像ES6之前的Javascript一样)

这种设计的最初原因(如果我理解正确的话)是,如果需要块作用域变量,那么代码可能太复杂了,分解函数是个好主意(请注意,您可以在Python中创建本地函数/闭包,因此这并不一定意味着代码需要像使用C一样进行扩展和非本地化)

作为“无块作用域”规则的例外,在理解中使用Python3变量时,理解是局部的,即

x = [i*i for i in range(10)]
Python2中的
i
将是9,但Python3中的表达式不会泄漏任何变量
i

Python的作用域规则不是很复杂:如果函数体中有赋值(或像
+=
-=
等增强的赋值),那么变量被视为局部变量,如果只是为了读取而访问,则变量被视为来自外部作用域(如果函数处于顶层,则为全局函数)

如果需要修改函数中的全局值(不是经常发生的事情),则需要使用
global
显式声明它


在Python3中,还可以使用
非局部
声明访问内部函数中捕获的局部变量进行写入。在Python2中,捕获的局部变量只能在内部函数中读取(赋值将使它们成为内部函数的局部函数,
global
声明将使它们成为全局函数).

官方文档中有关于python/c++作用域规则的详细解释。阅读时您不明白其中的哪一部分?您肯定不想让我们重复所有内容或复制粘贴它。在两个循环之后,循环变量都有它给出的最后一个值。您的评论声称某些差异是错误的。您好,@timgeb,I di如果找不到相应的部分,请附加一个链接好吗?非常感谢!请至少阅读教程,直到它开始讨论stdlib模块。基本上,模块是一个作用域,每个类和函数都是一个新的作用域,块不是作用域。不知怎的,你的问题缩短为:如何不再重复同样的错误答案很简单:集中和集中。闭包中也有捕获的变量,出于语法原因,通常是只读的,但也可以是读写的(仅使用Python3)这是错误的。Python允许从包含作用域访问变量。在Python 3.x中,您甚至可以使用显式引用外部作用域的变量(有关详细信息,请参阅)@6502:关于
非局部
,您是对的,但实际上它解决了另一个问题-引用外部作用域函数。基本上,它不会引入新的作用域类型。@ZbynekVyskovsky-kvr000:这取决于您如何定义作用域。捕获的变量是局部变量,但是其他人的局部变量:在函数中有局部变量,也有其他人的局部变量。@ZbynekVyskovsky-kvr000lse(捕获)和globals(以及Python3中的理解迭代变量)。
x = [i*i for i in range(10)]