可能重复:
“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的怪癖,或者我只是错过了一些东西!
答案 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