【发布时间】:2013-07-15 05:27:27
【问题描述】:
我们来看一个简单的代码:
y = [1,2,3]
def plusOne(y):
for x in range(len(y)):
y[x] += 1
return y
print plusOne(y), y
a = 2
def plusOne2(a):
a += 1
return a
print plusOne2(a), a
“y”的值发生变化,但“a”的值保持不变。我已经知道这是因为一个是可变的,另一个不是。但是如何修改代码让函数不改变列表呢?
例如做这样的事情(为了简单起见,用伪代码):
a = [1,2,3,...,n]
function doSomething(x):
do stuff with x
return x
b = doSomething(a)
if someOperation(a) > someOperation(b):
do stuff
编辑:抱歉,我有关于嵌套列表的另一个问题。请参阅此代码:
def change(y):
yN = y[:]
for i in range(len(yN)):
if yN[i][0] == 1:
yN[i][0] = 0
else:
yN[i][0] = 1
return yN
data1 = [[1],[1],[0],[0]]
data2 = change(data1)
在这里它不起作用。为什么?再次:如何避免这个问题?我理解为什么它不起作用:yN = y[:] 将 y 的值复制到 yN,但这些值也是列表,因此对于列表中的每个列表,操作必须加倍。如何使用嵌套列表进行此操作?
【问题讨论】:
-
一般来说,避免突变引起混淆的最简单方法是避免突变。当这不合适时,答案是制作一个副本并对其进行变异。真的没有其他选择了。
-
既然您接受了@kindall 的回答,也许您会发现this blog post 很有帮助。它更详细地解释了事情,(在我看来)更清晰。
标签: python list function variables nested-lists