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 年最流行的答案中称为 不可变对象 ,复合实体称为 可变对象 ,否则我的答案是一致的用旧的答案。
我正在学习 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 年最流行的答案中称为 不可变对象 ,复合实体称为 可变对象 ,否则我的答案是一致的用旧的答案。