我剛開始做一個有趣的不同型別排序演算法的專案,但我就是不明白為什么這個函式會覆寫一個變數。
我有一個主檔案:
import bubble
test = [5, 4, 3, 2, 1]
def main():
print(test) # output: [5, 4, 3, 2, 1]
print(bubble.oneCycle(test)) # output: [4, 3, 2, 1, 5]
print(test) # output: [4, 3, 2, 1, 5] || and not [5, 4, 3, 2, 1]?
if __name__ == "__main__":
main()
我的“bubble.py”檔案中有這些功能:
def compareTwo(a, b):
if a > b:
return [b, a]
elif a < b:
return [a, b]
else:
return False
def oneCycle(arr):
for i in range(len(arr)-1):
ans = compareTwo(arr[i], arr[i 1])
arr[i] = ans[0]
arr[i 1] = ans[1]
return arr
def fullCycle(arr):
return arr
我還有一個__init__.py檔案:
from .bubble import compareTwo
from .bubble import oneCycle
from .bubble import fullCycle
所以你可以閱讀主檔案中的注釋,但是當我呼叫bubble.oneCycle(test)它時會覆寫我的測驗串列。為什么這樣做?
uj5u.com熱心網友回復:
好的,所以我找到了答案;在bubble.py中更改串列時,它使用“測驗”串列,因此更改了串列。我已經通過呼叫 bubble.oneCycle(test.copy())而不是修復它bubble.oneCycle(test)
uj5u.com熱心網友回復:
這是因為參考。當使用陣列引數呼叫 oneCycle 函式時,它的參考被傳遞。
因此,oneCycle 函式中的變數 arr 與 main 函式中的測驗變數指向同一個記憶體。所有排序都發生在原始陣列本身上。
這個鏈接在這里,但可以幫助您更好地理解。https://stackoverflow.com/a/33066581/14145421
uj5u.com熱心網友回復:
您可以使用多個引數并將測驗解壓縮到 oneCycle 的引數中。
def oneCycle(*args):
# use args instead of arr, it should work fine.
.
.
.
print(bubble.oneCycle(*test))
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/445770.html
標籤:Python 数组 python-3.x 列表
下一篇:用可迭代替換切片
