2017-10-09 103 views
0

我不太熟悉Python,所以請原諒我,如果這兩件事情是不相關的。Python列表理解和SQLALCHEMY

我正在第一次使用ORM(SQLALCHEMY),它很有趣但很混亂。今天我遇到了一個奇怪的問題,我很困惑,但希望有人能爲我清理它。基本上我想知道這之間的區別是什麼:

[[x.item for x in y.items] for y in yy] 

這:

[x.item for x in [y.items for y in yy]] 

基本上,yy是結果集的查詢(Y.query.all())和物品是在sqlalchemy db模型中定義的關係。在第二個循環中,我被告知x沒有屬性項,但是在第一個循環中,我的代碼是有效的。我很高興我終於可以實現這個目標,但是我很困惑它爲什麼會起作用。

在這兩種情況下,y.items是否應該具有相同的值?

在列表理解中是否從左到右嵌套?

+2

https://stackoverflow.com/questions/8049798/understanding-nested-list-comprehension – ayhan

回答

2

嚴格地說,注意[[x.item for x in y.items] for y in yy]相當於

list_ = [] 
for y in yy: 
    list_.append([x.item for x in y.items]) 

好了點。


雖然 [x.item for x in [y.items for y in yy]],相當於

list_ = [] 
for x in [y.items for y in yy]: 
    list_.append(x.item) 

或把不同,使用比x

list_ = [] 
for y_items in [y.items for y in yy]: 
    list_.append(y_items.item) 

是否每個y_items擁有的財產item一個更有意義的名字嗎?不,不是的。 反向y_items中包含的每個元素的確如前所述稱爲「第一循環」,即[x.item for x in y.items]


總之,

不應該y.items在這兩種情況下相同的值?

沒有因爲在「第一圈」,你得到的y.items每個元素的item財產而在「第二循環」你(嘗試)獲得的y.itemsitem財產本身。

+1

太棒了!這很有道理,謝謝 –