2016-04-06 26 views

cevap

1

Bu formun oldukça vanilya liste anlama geçerli:

[expression for var in iterable] 

Bu durumda, expression sadece başka liste anlama olur. Dolayısıyla, iç kavrama, ikincil dış tarafından elde edilen her bir madde için bir kez değerlendirecektir.

biz bir fonksiyonu haline iç anlama kırdı eğer biraz daha net hissedebilirsiniz: (umarım zaten)

def inner(i): 
    return [i * j for j in range(3, 5)] 

l = [inner(i) for i in range(3)] 

Şimdi daha net görmek dış anlama için bir kez çalıştırmak için iç anlama neden olduğunu Her bir "i", range(3). . i tek bir değer bağlıdır

[i*j for j in range(3,5)] 

, içinde:

0

içeri dışarıdan yürütülmektedir düşünün Bu durumda

[X for i in range(3)] 

X kendisi başka liste anlama olduğunu.

Yani şu yılında [[0*3,0*4],[1*3,1*4],[2*3,2*4]] veya [[0,0],[3,4],[6,8]],

0

genişler:

l = [[i * j for j in range(3, 5)] for i in range(3)] 

i

değerlere 0, 1 ve 2 alır. i her bir değeri için, iç içe liste anlama değerlendirilir ve sonuç üst düzey listesine kaydedilmiş: Burada

[i * j for j in range(3, 5)] 

, j değerler 3 ve 4 alır. Her bir değer için, j ürününün mevcut değeri i ile kaydedilir. Eğer [0, 0] olsun yani 0i ilk değeri için

, bu, 0 kez j değerindedir. Eğer [3, 4] almak yüzden yani 1 i ikinci değer için

, bu, 1 kez j değerindedir. Eğer [6, 8] olsun yani 2 i üçüncü değer için

, bu, 2 kez j değerindedir.

nihai sonuç getirecek şekilde, bu üç alt listelerinin oluşan listesi:

[[0, 0], [3, 4], [6, 8]] 
0
l = [[i * j for j in range(3, 5)] for i in range(3)] 

hayal olabilir:

(1) l = [[i * j for j in range(3, 5)] with i = 0] => [[0*3, 0*4]]= [[0,0]] 
+(2) l = [[i * j for j in range(3, 5)] with i = 1] =>[[0,0], [3,4]] 
+(3) l = [[i * j for j in range(3, 5)] with i = 2] =>[[0,0], [3,4], [6,8]]