簡體   English   中英

Python函數,覆蓋原始變量

[英]Python function, overwrite original variable

我有這個功能:

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的函數?

在函數def中:

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"]

您不能覆蓋參數的值。 也就是說,您不能將其更改為引用另一個對象。 但是,您可以更改對象。 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)

就是說,這段代碼對我來說很丑陋,聞起來很糟,我不建議這樣做。

您可以,但這是開展業務的可怕方式。 而是返回該值,請記住,如果您願意,可以返回多個值。 但是,這是通過參數返回值的一種方法。 但是不要使用它。

>>> def a(b):
...     b[0] = 'hi'
....
>>> c = ['nono']
>>> a(c)
>>> print(c)
['hi']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM