class Some(object):
tokens = [ ... list of strings ... ]
untokenized = [tokens.index(a) for a in [... some other list of strings ...]]
... etc ...
some = Some()
这适用于 Python2.7。然而 python3 说:
Traceback (most recent call last):
File "./test.py", line 17, in <module>
class Some(object):
File "./test.py", line 42, in Some
untokenized = [tokens.index(a) for a in [... some other list of strings ...]]
File "./test.py", line 42, in <listcomp>
untokenized = [tokens.index(a) for a in [... some other list of strings ...]]
NameError: global name 'tokens' is not defined
虽然我可以解决这个问题,但我真的很想知道 Python2 和 Python3 之间的区别。我已阅读 python 2->3 更改文档,但我无法识别与我的问题相关的任何描述。工具也2to3
不会在我的代码中抱怨任何内容。
顺便说一句,虽然我现在不记得情况了,但我也只有与 python2 类似的东西(我什至没有用 3 尝试过),我认为这应该可以工作(在一个类中):
def some_method(self):
return {a: eval("self." + a) for a in dir(self) if not a.startswith("_")}
但是它会导致 python2 说:NameError: name 'self' is not defined
我还没有用 python3 尝试过这个,但是例如这有效:
[eval("self." + a) for a in dir(self) if not a.startswith("_")]
如果我将上一个示例的相关部分更改为这个(好吧,示例本身有点愚蠢,但至少显示了我的问题)。现在我很好奇,为什么self
似乎没有为第一个示例定义,而是为第二个示例定义?似乎对于 dicts,我有类似的问题,我的原始问题是关于的,但是使用列表生成器表达式它可以工作,但在 python3 中不起作用。嗯...
在我的 python2 -> 3 问题之后,我提到了这一点,因为所有这些似乎都是关于没有根据 python 解释器定义的问题(也许我的问题的第二部分是不相关的?)。我现在感到很困惑。请告诉我我的错误(因为我确定我当然错过了一些东西)。