我认为这是一个简单的问题,但仍希望快速清楚地回答我的案例:
def get_query_history(idx, url, archive_location):
idx = idx + 1
return idx # I meant to return the idx's value (end up 1000 for every call) and used it in the next loop in main
main:
idx = 1
while current <= end_date:
with open(archive_location, 'a') as the_archive:
get_query_history(idx, url, archive_location) # I want to increase the idx every time I call the function
显然这不是我应该在python中使用的方式,任何人都可以启发我吗?
答案 0 :(得分:0)
在这里,我会将其作为答案发布,但我会稍微扩展一下。
由于您返回idx
增加值,只需将其存储回“主”范围:
idx = 1
while current <= end_date:
with open(archive_location, 'a') as the_archive:
idx = get_query_history(idx, url, archive_location)
# make sure you update your `current` ;)
在某些语言中,您可以选择通过引用将变量传递给函数,以便函数可以更改其值,这样您就不需要返回值。 Python类型通过引用传递,但由于简单值是不可变的,每当您尝试在函数中设置其值时,引用将被覆盖。
这不适用于封装对象,因此您可以将idx
封装在列表中,然后将其作为列表传递。在这种情况下,您根本不需要返回:
def get_query_history(idx, url, archive_location):
idx[0] += 1
# do whatever else
# in your main:
idx = [1] # encapsulate the value in a list
while current <= end_date:
with open(archive_location, 'a') as the_archive:
get_query_history(idx, url, archive_location) # notice, no return capture
# make sure you update your `current` ;)
但通常情况下,如果你可以返回值,则不需要这些恶作剧,只是证明函数可以在某些条件下修改传递的参数。
而且,最后,如果你真的想要强制传递引用行为,那么你可以完全破解Python来做check this(并且从不在生产中使用它!);)