1

可能的重复:
Python 中的“Least Astonishment”:可变默认参数

我在 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 的一个怪癖,或者我只是错过了一些东西!

4

2 回答 2

2

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

于 2012-12-29T18:42:24.050 回答
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 = []
于 2012-12-29T18:39:35.137 回答