簡體   English   中英

在python(jupyter)中復制變量/對相同的變量使用不同的函數

[英]Copy a variable in python (jupyter) / Use different functions with same variables

我用python編寫了一個小型Programm,但是它沒有按預期工作。

這是代碼:

puzzle = [8, 7, 5, 4, 1, 2, 3, 0, 6]
def count(p):
        p[0] += 1
        return p
def main(p):
    print(p)
    l = count(p)
    print(l)
    print(p)

b1 = main(puzzle)

我希望print(p)與print(l)不同,但是兩者的結果相同,這是print(l)應該具有的結果。 但是p也做了更改,但是我需要將其保持不變……這是一種特殊的python行為嗎? 有什么我想念的嗎? 我也嘗試更改函數中的變量名,但這沒有幫助。 我重新啟動了編譯器,但這也無濟於事。

有沒有解決方案來存儲函數輸出,然后再次調用函數而不讓函數更改給定參數? 這樣,l將成為計算后的結果,而p將保持在該值之前?

親切的問候,Joh。

您正在傳遞一個List參數。 參數傳遞是按對象調用。 由於列表在這種情況下是可變對象,因此類似於通過引用傳遞,並且對列表對象的更改將繼續存在。 如果您傳遞的是不可變值(例如Integer或String),則類似於通過復制/值傳遞,並且更改不會持久。 例如:

def s2asdf(s):
    s = "asdf"

s = "hello world"
s2asdf(s)
print s

... 結果是:

$ python example.py
hello world

這樣做的原因是因為Python通過引用傳遞了函數參數。 當您調用count函數時,它允許該函數修改函數內部的列表,並且更改將應用​​於原始對象。

如果要讓函數不修改列表而是返回其他列表,則必須通過將副本傳遞給函數或在函數內部進行復制來復制列表。 有很多方法可以在Python中復制列表,但是我喜歡使用list()函數來實現。

這應該可以解決您的問題:

puzzle = [8, 7, 5, 4, 1, 2, 3, 0, 6]
def count(p):
    new_list = list(p)  # copy values of p to new_list
    new_list[0] += 1
    return new_list

def main(p):
    print(p)
    l = count(p)
    print(l)  # l is the new_list returned from count
    print(p)  # p stays the original value

b1 = main(puzzle)

暫無
暫無

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

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