簡體   English   中英

將列表指針傳遞給函數而不是列表

[英]passing a list pointer to a function rather than the list

是否可以將(移動的)指向列表開頭的指針傳遞到Python中的函數中?

我在列表的一部分上有一個遞歸函數。 列表本身不會更改,只是指向其中的“起點”的指針。 我遇到的問題是,長長的列表殺死了內存溢出的代碼。

這是代碼:

def trim(l):
    print("list len= ", len(l))
    if len(l)!= 1:
        trim(l[1:])
    else:
        print("done")

上面的示例是人為設計的,我的實際代碼除了剪裁列表之外還執行其他操作,但是它還有一個移動的起始指針。 一百萬個整數列表在10G RAM計算機上耗盡了內存。

任何想法都歡迎。

如果您正在編寫一個非尾調用遞歸函數以遍歷列表,則問題很可能是堆棧溢出或與堆棧大小有關的內存不足錯誤。

我建議使用整數指針和for循環來重寫它,因為Python似乎沒有尾調用優化。

這是您可能想要做的一個猜測:

x = [0,0,0,0,0,1,2,3,4]

def trim_leading_zero(l):
  the_len = len(l)
  start_i = 0
  for i in xrange(the_len):
    if l[i] != 0:
      return l[i:]

>>> trim_leading_zero(x)
[1, 2, 3, 4]

從您的代碼尚不清楚它實際上意味着什么。 如果您嘗試實際返回一個序列,則可能需要查看Generators,它們不需要在內存中保存整個序列。

您不能只傳遞索引而不是傳遞整個新列表嗎?

因此,您將調用trim(l, 0) ,然后對照列表的長度檢查索引,然后在需要時調用trim(l, 1)

def trim(l, idx):
    print("list len = ", (len(l) - idx))
    if idx < (len(x) - 1):
        trim(l, idx + 1)
    else:
        print("done")

處理大數據時,請使用生成器,而不是常規的迭代器。

def trim(l):
    print("list len= ", len(l))
    pointer = 0
    if len(l)!= 1:
        yield l[pointer:]
        pointer += 1
    else:
        print("done")

x = [1, 2, 3, 4, 5, 6, 7, 8, 9]

for i in trim(x):
    print i

# [1, 2, 3, 4, 5, 6, 7, 8, 9]

生成器一次生成一個項,讓您隨心所欲地做, 避免在處理之前先創建整個列表。 如果要從中獲取列表,則只需執行list(trim(x))

這里對yieldgenerators有很好的解釋-yield關鍵字有什么作用

暫無
暫無

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

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