1

我有这个功能:

def icaocode(code):
    c.execute("SELECT ICAO, LAT, LON FROM airports WHERE ICAO = ?", (code,))
    result = c.fetchone()
    if result is None:
        print("No airport found with ICAO code", code)
        sys.exit()
    else:
        print("Found", code)
        [...]

可以说我用

icaocode(x)

如何获得用结果覆盖 x 的函数?

4

3 回答 3

4

在函数定义中:

def icaocode(code):
    ...
    return code  # new value

调用时:

x = icaocode(x)

顺便说一句,如果参数是可变的(如列表),您可以覆盖它而不返回新值。如果它是不可变的(如字符串、整数),则不能。

例如

def f(some_list):
    some_list.append("something")

在这种情况下

my_list = []
f(my_list)

my_list将会["something"]

于 2013-09-19T13:36:11.780 回答
3

您不能覆盖参数的值。也就是说,您不能将其更改为引用另一个对象。但是,您可以更改对象。在 Python 中有一个关于按值传递和按引用传递语义的旧线程,您可能会发现它很有启发性:https ://stackoverflow.com/a/986145/399047

例如,您可以将元素附加到作为参数传入的列表中。以下代码:

def func(a_list):
    a_list.append("some value")

l = [1,2,3]
print l
func(l)
print l

会给:

[1,2,3]
[1,2,3,"some value"]

相反,字符串不能被修改。以下代码:

def func2(a_str):
    a_str += "suffix"

s = "test"
print s
func2(s)
print s

会给:

"test"
"test"

除非您有充分的理由,否则我的建议是避免改变您的输入参数,而是返回修改后的对象。副作用会导致代码混乱。

如果在所有这一切结束时您真的想修改输入参数,一种技术是将代码参数包装在另一个对象中。例如

def icaocode(code_list):
    input_code = code_list[0]
    [...]
    # do something to input_code, assign result to
    # output_code
    [...]
    code_list[0] = output_code

然后你会打电话给:

code_list = [code]
icaocode(code_list)

也就是说,这段代码对我来说很难看,闻起来很糟糕,我不推荐它。

于 2013-09-19T13:56:36.057 回答
2

你可以,但这是一种可怕的开展业务的方式。而是返回值,请记住,如果您愿意,可以返回多个值。然而,这是通过参数返回值的一种方法。但不要使用它。

>>> def a(b):
...     b[0] = 'hi'
....
>>> c = ['nono']
>>> a(c)
>>> print(c)
['hi']
于 2013-09-19T13:40:58.303 回答