3 回答

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超3個(gè)贊
Python變量包含指向?qū)ο蟮闹羔樆蛞?。所有值(甚至整?shù))都是對(duì)象,賦值會(huì)將變量更改為指向其他對(duì)象。它不會(huì)在變量中存儲(chǔ)新值,而是會(huì)更改變量以引用或指向其他對(duì)象。由于這個(gè)原因,許多人說Python沒有“變量”,而是有“名稱”,并且該=
操作不是“將值分配給變量”,而是“將名稱綁定到對(duì)象”。
在plusOne
您修改(或“變異”)內(nèi)容時(shí),請y
不要更改其y
本身的含義。它始終指向同一列表,即您傳遞給函數(shù)的列表。全局變量y
和局部變量y
引用相同的列表,因此使用這兩個(gè)變量都可以看到更改。由于您更改了傳入的對(duì)象的內(nèi)容,因此實(shí)際上沒有理由返回y
(實(shí)際上,返回None
是Python本身對(duì)諸如此類的操作進(jìn)行的操作,這些操作可以“就地”修改列表-值由操作返回)創(chuàng)建新對(duì)象,而不是對(duì)現(xiàn)有對(duì)象進(jìn)行變異)。
在plusOne2
你正在改變局部變量a
來引用不同的整數(shù)對(duì)象3
。(“將名稱綁定a
到對(duì)象3
?!保┤肿兞?code>a不會(huì)因此改變,而是繼續(xù)指向2
。
如果您不想更改傳入的列表,請對(duì)其進(jìn)行復(fù)制并進(jìn)行更改。然后,您的函數(shù)應(yīng)返回新列表,因?yàn)樗莿?chuàng)建新對(duì)象的那些操作之一,如果不返回該新對(duì)象,該新對(duì)象將丟失。您可以將其作為函數(shù)的第一行:x = x[:]
例如(如其他人指出的那樣)?;蛘撸绻匀魏我环N方式調(diào)用該函數(shù)可能有用,則可以在調(diào)用者x[:]
希望復(fù)制的情況下傳遞給調(diào)用者。

TA貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超3個(gè)贊
創(chuàng)建列表的副本。使用testList = inputList[:]
??创a
>>> def plusOne(y): newY = y[:] for x in range(len(newY)): newY[x] += 1 return newY>>> y = [1, 2, 3]>>> print plusOne(y), y[2, 3, 4] [1, 2, 3]
或者,您可以在函數(shù)中創(chuàng)建一個(gè)新列表
>>> def plusOne(y): newList = [] for elem in y: newList.append(elem+1) return newList
您還可以像其他人指出的那樣使用理解力。
>>> def plusOne(y): return [elem+1 for elem in y]
添加回答
舉報(bào)