Python递归函数变量范围

时间:2012-12-29 18:27:10

标签: python

  

可能重复:
  “Least Astonishment” in Python: The Mutable Default Argument

我正在使用Python中的MailSnake,它是MailChimp API的包装器。

现在我对我编写的用于提取订阅者列表的函数感到好奇。这是我正在使用的代码:

from mailsnake import MailSnake
from mailsnake.exceptions import *

ms = MailSnake('key here')

def return_members (status, list_id, members = [], start = 0, limit = 15000, done = 0):
    temp_list = ms.listMembers(status=status, id=list_id, start=page, limit=limit, since='2000-01-01 01:01:01')
    for item in temp_list['data']:  # Add latest pulled data to our list
        members.append(item)
    done = limit + done
    if done < temp_list['total']:  # Continue if we have yet to 
        start = start + 1
        if limit > (temp_list['total'] - done):  # Restrict how many more results we get out if are on the penultimate page
            limit = temp_list['total'] - done
        print 'Making another API call to get complete list'
        return_members(status, list_id, members, page, limit, done)
    return members

for id in lists:
    unsubs = return_members('subscribed',id)
    for person in unsubs:
        print person['email']

print 'Finished getting information'

因此,此函数以递归方式运行,直到我们从给定列表中提取所有成员为止。

但我注意到的是变量unsubs似乎变得越来越大。因为当使用不同的列表id调用函数return_members时,我得到了到目前为止我调用的每个列表的电子邮件的合并(而不仅仅是一个特定的列表)。

如果我调用return_members('subscribed',id,[])明确地给它一个新的数组,那就没关系了。但我不明白为什么我需要这样做,好像我用不同的列表ID调用函数,它没有递归运行,因为我没有指定成员变量,它默认为[]

我认为这可能是python的怪癖,或者我只是错过了一些东西!

2 个答案:

答案 0 :(得分:1)

尝试更换:

def return_members (status, list_id, members = [], start = 0, limit = 15000, done = 0):

使用:

def return_members (status, list_id, members = None, start = 0, limit = 15000, done = 0):
    if not members: members = []

答案 1 :(得分:1)

Martjin链接的SO臭名昭着的问题可以帮助您理解下划线问题,但要解决这个问题,您可以编写以下循环

for item in temp_list['data']:  # Add latest pulled data to our list
    members.append(item)

更加pythonic版本

members = members + temp_list['data'] # Add latest pulled data to our list

这一小改动将确保您使用的实例与作为参数传递的实例不同return_members