Python 2.x 中,在列表推导中 for 关键词之后的赋值操作可能会影响列表推导上下文中的同名变量。像下面这个 Python 2.7 控制台对话:
Python 2.7.15 (default, May 1 2018, 05:55:50) [GCC 7.3.0] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> i = 888 >>> i 888 >>> list1 = [i for i in range(10)] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> i 9
如你所见,i 原本的值被取代了,但是这种情况在 Python 3 中是不会出现的:
Python 3.6.5 (default, May 11 2018, 13:30:17) [GCC 7.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> i = 888 >>> i 888 >>> list1 = [i for i in range(10)] >>> list1 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> i 888
列表推导、生成器表达式,以及同它们很相似的集合(set)推导和字典(dict)推导,在 Python 3 中都有了自己的局部作用域,就像函数似的。表达式内部的变量和赋
值只在局部起作用,表达式的上下文里的同名变量还可以被正常引用,局部变量并不会影响到它们。