簡體   English   中英

將列表理解傳遞給Python中的函數

[英]Passing List Comprehension to a function in Python

我有一個函數,希望將列表理解作為輸入傳遞給我。 我收到有關未定義my_list的錯誤。 我知道我可以將my_list放在函數之外,但實際上,列表是作為函數的一部分生成的。

實際定義很復雜,因此這里是簡化示例:

def my_def(list_comp):
    global my_list
    my_list = [[1,2],[3,4]]
    list_comp_output = list_comp
    return list_comp_output

print my_def([x[1] for x in my_list])

實際上, 我們在Python中擁有的只是運行時。 不存在單獨的編譯時間 1 (在解釋器范圍內)。 並且功能也不例外。

因此,您在此處所做的就是將my_list定義為全局變量,並在python未定義此類內容時嘗試在列表理解中使用它。

您可以只運行函數1次,然后使用該列表理解:

def my_def(list_comp):
    global my_list
    my_list = [[1,2],[3,4]]
    list_comp_output = list_comp
    return list_comp_output


my_def([])
print my_def([x[1] for x in my_list])
[2,4]

另外我在這里看不到任何邏輯的東西:)如果您想使用全局變量,只需定義是否在模塊范圍內(在函數之外並將其傳遞給函數)。

def my_def(list_comp):
    # do stuff with list_comp
    return list_comp_output


my_list= # a costume list 
li=[x[1] for x in my_list]
print my_def(li)

或者更優雅地在函數中進行列表理解:

def my_def(list_comp):
    return [x[1] for x in list_comp]

1. Mark Lutz學習Python

那是因為未定義my_list;)

首先,您必須意識到函數定義中的主體(但是,如果有默認參數,則它們將立即被評估)直到實際調用該函數時才執行,但是在調用該函數之前先評估它的參數。

它的前兩個語句首先說符號my_list是此函數中全局范圍的符號。 第二個表示將符號[[1,2],[3,4]]分配給該符號(在全局范圍內)。 但這確實沒有提到在調用函數之前發生(因此,在函數定義之后,它仍然沒有定義)。

這樣的結果是,您嘗試在my_list定義或分配給my_list之前(在函數體內)求值。

您可以嘗試通過首先調用my_def([])來實現它,該方法將定義my_list ,但是正確的方法可能是將my_list的定義放在函數定義之外:

my_list = [[1,2],[3,4]]

def my_def(list_comp):
   list_comp_output = list_comp
   return list_comp_output

print my_def([x[1] for x in my_list])

給出答案:

[2, 4]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM