引用全局基元与对象
Referencing global primitives vs. objects
有人可以解释 Python 中的以下结果吗?
当运行下面的代码片段时,Python 抛出一个错误,指出变量 x
在赋值之前被引用:
x = 1
def increase_x():
x += 1
increase_x()
当然,解决方案是在 increase_x
.
的函数声明之后包含行 global x
然而,当运行下一段代码时,没有错误,结果如您所愿:
x = [2, -1, 4]
def increase_x_elements():
for k in range(len(x)):
x[k] += 1
increase_x_elements()
这是因为整数是 Python 中的原语(而不是对象)所以第一个片段中的 x
是存储在内存中的原语,而第二个片段中的 x
引用指向列表对象的指针?
正如 Ffisegydd 指出的那样,Python 中不存在原始类型:一切皆对象。
但是您应该注意,您在这两个片段中做的是两件完全不同的事情。首先,您将 x
重新绑定到 x+1 的值。通过尝试分配给 x,您已将其设为本地范围,因此您对 x+1 的引用失败。
在第二个片段中,您正在修改 x 的内容,而不是重新绑定它。这是可行的,因为列表是可变的,但区别不在于可变与不可变,而是可变与重新绑定:重新绑定可变对象会失败,就像使用整数一样。
In Python, variables that are only referenced inside a function are implicitly global. 这就是下面代码有效的原因。
x = 1
def increase_x():
print(x + 1)
increase_x()
但是,If a variable is assigned a value anywhere within the function’s body, it’s assumed to be a local unless explicitly declared as global.在您的第一个示例中,由于此 x += 1
分配,x 不再是全局的。
有人可以解释 Python 中的以下结果吗?
当运行下面的代码片段时,Python 抛出一个错误,指出变量 x
在赋值之前被引用:
x = 1
def increase_x():
x += 1
increase_x()
当然,解决方案是在 increase_x
.
global x
然而,当运行下一段代码时,没有错误,结果如您所愿:
x = [2, -1, 4]
def increase_x_elements():
for k in range(len(x)):
x[k] += 1
increase_x_elements()
这是因为整数是 Python 中的原语(而不是对象)所以第一个片段中的 x
是存储在内存中的原语,而第二个片段中的 x
引用指向列表对象的指针?
正如 Ffisegydd 指出的那样,Python 中不存在原始类型:一切皆对象。
但是您应该注意,您在这两个片段中做的是两件完全不同的事情。首先,您将 x
重新绑定到 x+1 的值。通过尝试分配给 x,您已将其设为本地范围,因此您对 x+1 的引用失败。
在第二个片段中,您正在修改 x 的内容,而不是重新绑定它。这是可行的,因为列表是可变的,但区别不在于可变与不可变,而是可变与重新绑定:重新绑定可变对象会失败,就像使用整数一样。
In Python, variables that are only referenced inside a function are implicitly global. 这就是下面代码有效的原因。
x = 1
def increase_x():
print(x + 1)
increase_x()
但是,If a variable is assigned a value anywhere within the function’s body, it’s assumed to be a local unless explicitly declared as global.在您的第一个示例中,由于此 x += 1
分配,x 不再是全局的。