【发布时间】:2020-07-23 22:18:23
【问题描述】:
我对 Python 中外部函数变量相对于内部函数的范围感到困惑。
似乎如果外部函数中的变量是列表或数组,则内部函数可以更改它,而如果它是标量则不能。例如,以下代码给出 c = [0,-10] 的输出。
def foo1():
a = [0,1]
def foo2():
a[1] = -10
foo2()
return a
c = foo1()
而下面的代码给出 c = 1。
def foo1():
a = 1
def foo2():
a = -10
foo2()
return a
c = foo1()
为什么变量的类型应该有所不同?这和指针有关吗?
【问题讨论】:
-
对变量的赋值使其默认为本地;您的第二个示例需要
foo2()中的nonlocal a才能实际引用外部函数的变量。但是a[1] = -10不是对a的赋值,它是它的一个突变,所以外部变量被引用。 -
注意,变量没有类型。 被变量引用的对象的类型是无关的。使用
a = [0, 1],然后在内部函数中执行a = [-10, 1],您将看到相同的行为。在第一种情况下,您正在改变具有局部引用的对象,在第二种情况下,您正在为一个新的局部变量赋值。两种完全不同的东西。我建议阅读以下内容:nedbatchelder.com/text/names.html