列表推到式中的变量作用域

demo.py

for i in [1,2,3]:
    [i for i in range(10)]
    print(i)
    
  • 在python 2 中的执行结果为:9,9,9
  • 由于python2 中i 的索引变量泄露到for 循环中导致。所以在循环中要使用不同的索引变量名。
  • 在python 3 中的执行结果为:1,2,3

例如:

`# a_list = [[1,2,3],[4,5,6],[7,8,9]]
由于python2 中列表推到式索引变量泄露,只能在Python2 中才会出现下面的结果。
# a=[x for row in a_list for x in row]
# print(a)
# # 值是 [1, 2, 3, 4, 5, 6, 7, 8, 9]
# # row的作用域泄露到for上面的循环中。会在上面的推到式中找row的值,row 是一个临时变量,最后一次赋值是[7,8,9],继续循环。
# b=[x for x in row for row in a_list]
# # 值是 [7, 7, 7, 8, 8, 8, 9, 9, 9]
# print(b)`

python3 中b 报错:

Traceback (most recent call last):
  File "E:/flask/flask基础/flask_demo/demo_装饰器/案例.py", line 33, in <module>
    b=[x for x in row for row in a_lit]
NameError: name 'row' is not defined

单独在python2 和 python3 中运行 b=[x for x in row for row in a_list],都会报错,
这种写法本来就是错的,但是由于Python2 的变量作用域,先运行 a=[x for row in a_list for x in row],在运行b=[x for x in row for row in a_list],可以达到意想不到的结果,可以起到容错的效果。不会报错。结果值 [7, 7, 7, 8, 8, 8, 9, 9, 9]。

猜你喜欢

转载自blog.csdn.net/weixin_44224529/article/details/88864681