在python

时间:2017-12-11 21:20:17

标签: python

我认为这是一个简单的问题,但仍希望快速清楚地回答我的案例:

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中使用的方式,任何人都可以启发我吗?

1 个答案:

答案 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(并且从不在生产中使用它!);)