Trong đoạn mã sau, các mc
assigment hoạt động tốt bằng Python 2 và 3.Quy tắc phạm vi hiểu danh sách trong lớp Python là gì?
Các cc
chuyển nhượng, trong đó sử dụng danh sách hiểu giống nhau trong một lớp học, làm việc trong Python 2 nhưng không thành công với Python 3.
Điều gì giải thích hành vi này?
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)
tôi có được điều này:
(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
Tại sao lớp biến cl2
không được định nghĩa? Lưu ý rằng nhiệm vụ cc2
hoạt động tốt, cũng như cc1
. Trao đổi cl1
và cl2
trong sự hiểu biết cho thấy rằng vòng lặp thứ hai là một trong đó gây nên các ngoại lệ, không cl2
per se)
phiên bản:.
(default-3.5) snafu$ python2 --version
Python 2.7.11+
(default-3.5) snafu$ python3 --version
Python 3.5.1+
Điều này liên quan đến biến lớp so với biến mẫu, không phải phạm vi hiểu. – TigerhawkT3
@ TigerhawkT3: Trên thực tế, nó thực sự là về phạm vi biến ở mức độ hiểu lớp. – user2357112
http://stackoverflow.com/questions/20136955/python3-nested-list-comprehension-scope –