Python 中的词法范围

Lexical Scoping in Python

我正在学习 Python,更具体地说,我正在探索范围规则。

我尝试了以下 "experiment":

def increment(n): 
   n += 1 
   print(n)
   return n

n = 1 
increment(n) 
print(n) 

这段代码输出: 2 , 1 难道不应该输出 2, 2 因为变量n返回到全局环境了吗?

我们将不胜感激您的建议。

这里有两个不同的变量(名称):一个在全局范围内,另一个在 increment 本地。在 increment 中重新绑定本地的不会影响全局的,而 increment returns 它自己的 n 也不会影响全局的这一事实(事实他们有相同的名字是无关紧要的)。如果你想让全局 n 指向 increment() 返回的值,你必须明确地重新绑定它:

n = 1
print(n)
n = increment(n)
print(n)

考虑对上面的代码片段进行以下修改:

def increment(n): 
   n[0] += 1 
   print(n[0])
   return n

n = [1] 
increment(n) 
print(n[0]) 

这将打印 2、2。

在许多计算机语言(其中 Javascript)中,原始(如整数 1 和 2)或 [=20] 的函数参数之间存在差异=]compound(就像单元素列表 n[0])。通常基元按值传递(它们的值被复制到函数内部的临时变量)。复合实体通常不被复制,而是通过引用传递(传递实体的地址并从函数内部访问实体)。如果我查看上面两个代码片段的输出,在我看来 Python 也会造成这种差异。

PS 写完后我看了看a 2009 Stack Overflow question。原始实体在 2009 年最流行的答案中称为 不可变对象 ,复合实体称为 可变对象 ,否则我的答案是一致的用旧的答案。