您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

使用python3的列表生成器表达式中未定义的全局变量,可与python2一起使用,需要进行哪些更改?

使用python3的列表生成器表达式中未定义的全局变量,可与python2一起使用,需要进行哪些更改?

正如Wooble所说,问题是类没有词法范围(实际上,在Python 2Python 3中)。相反,它们具有不构成范围的本地 名称空间 。这意味着类定义中的表达式可以访问名称间的内容

class C:
    a = 2
    b = a + 2    # b = 4

但在类主体中引入的范围 无法 访问其名称空间:

class C:
    a = 2
    def foo(self):
        return a    # NameError: name 'a' is not defined, use return self.__class__.a

Python 2和Python 3之间的区别在于,在Python 2中,列表推导 不会 引入新的作用域:

[a for a in range(3)]
print a    # prints 2

而在Python 3中,它们执行以下操作:

[a for a in range(3)]
print(a)    # NameError: name 'a' is not defined

在Python 3中对此进行了更改,其原因有两个,包括使列表推导的行为与生成器表达式(genexps)相同。(a for a in range(3))在Python 2和Python 3中都有自己的作用域。

因此,在类的主体内,Python 2 genexp或Python 3 listcomp或genexp引入了新作用域,因此无法访问类定义本地名称空间。

赋予genexp / listcomp访问类定义名称空间名称方法是使用函数或lambda引入新作用域:

class C:
    a = 2
    b = (lambda a=a: [a + i for i in range(3)])()
python 2022/1/1 18:38:28 有337人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶