【发布时间】:2021-03-23 11:43:59
【问题描述】:
我正在学习 Python 3 中的作用域,这个例子让我很困惑。比较函数内部调用时列表变量和字符串变量的行为:
foo1 = []
foo2 = ''
def f():
foo1.append(3)
global foo2
foo2 += 'c'
print('foo1-in-f:',foo1)
print('foo2-in-f:',foo2)
print('foo1-before:',foo1)
print('foo2-before:',foo2)
f()
print('foo1-after:',foo1)
print('foo2-after:',foo2)
正如预期的那样,输出是:
foo1-before: []
foo2-before:
foo1-in-f: [3]
foo2-in-f: c
foo1-after: [3]
foo2-after: c
我很困惑为什么 string 必须声明为全局,就像在global foo2 行中一样,但 list 是 未声明为全局,因为在global foo1 中没有行。
我运行代码时省略了global foo2 行,不出所料地得到了UnboundedLocalError: local variable 'foo2' referenced before assignment。但是,为什么foo1 没有出现此错误?
感谢任何见解。我想确保我理解它是如何工作的。
【问题讨论】:
-
+=被实现为可变类型的突变,但不可变类型的重新绑定。一个要点是a += b通常不等同于a = a + b。 (正如您所观察到的,对于字符串来说,它是)。
标签: python-3.x string list scope