【发布时间】:2016-11-14 01:48:15
【问题描述】:
在以下代码中,mc 赋值在 Python 2 和 3 中运行良好。
cc 赋值在类中使用相同的列表推导,在 Python 2 中有效,但在 Python 3 中失败。
什么解释了这种行为?
ml1 = "a b c".split()
ml2 = "1 2 3".split()
mc = [ i1 + i2 for i1 in ml1 for i2 in ml2 ]
class Foo(object):
cl1 = ml1
cl2 = ml2
cc1 = [ i1 for i1 in cl1 ]
cc2 = [ i2 for i2 in cl2 ]
cc = [ i1 + i2 for i1 in cl1 for i2 in cl2 ]
print("mc = ", mc)
foo = Foo()
print("cc = ", foo.cc)
我明白了:
(default-3.5) snafu$ python2 /tmp/z.py
('mc = ', ['a1', 'a2', 'a3', 'b1', 'b2', 'b3', 'c1', 'c2', 'c3'])
('cc = ', ['a1', 'a2', 'a3', 'b1', 'b2', 'b3', 'c1', 'c2', 'c3'])
(default-3.5) snafu$ python3 /tmp/z.py
Traceback (most recent call last):
File "/tmp/z.py", line 5, in <module>
class Foo(object):
File "/tmp/z.py", line 11, in Foo
cc = [ i1 + i2 for i1 in cl1 for i2 in cl2 ]
File "/tmp/z.py", line 11, in <listcomp>
cc = [ i1 + i2 for i1 in cl1 for i2 in cl2 ]
NameError: name 'cl2' is not defined
为什么没有定义类变量cl2?请注意,cc2 分配工作正常,cc1 也是如此。在理解中交换cl1 和cl2 表明第二个循环是触发异常的循环,而不是cl2 本身。)
版本:
(default-3.5) snafu$ python2 --version
Python 2.7.11+
(default-3.5) snafu$ python3 --version
Python 3.5.1+
【问题讨论】:
-
这与类变量与实例变量有关,与理解范围无关。
-
@TigerhawkT3:实际上,这确实是关于类级理解中的变量范围。
标签: python python-2.7 python-3.x python-3.5