, mc
ödev Python 2'de çalışıyor ve 3.Bir Python sınıfında liste anlama kapsam belirleme kuralları nelerdir? Aşağıdaki kodda
bir sınıf içinde aynı liste anlama kullanır cc
atama, Python 2 çalışır ancak
Python 3. başarısız olur Bu davranışı ne açıklar?
(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
Neden sınıf değişkeni
cl2
tanımlanmadı:
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)
Ben bu olsun?
cc1
,
cc2
atama işleminin düzgün çalıştığını unutmayın. ,
Python 3
(default-3.5) snafu$ python2 --version
Python 2.7.11+
(default-3.5) snafu$ python3 --version
Python 3.5.1+
Bu, sınıf değişkenleri ve örnek değişkenler, anlama kapsamı ile ilgili değildir. – TigerhawkT3
@ TigerhawkT3: Aslında, gerçekten sınıf düzeyi anlamada değişken kapsam ile ilgilidir. – user2357112
http://stackoverflow.com/questions/20136955/python3-nested-list-comprehension-scope –