我写了一个简单的脚本如下:
def simplefunc(listofcolumns):
mylist = listofcolumns
mylist.remove(1)
listofcolumns = [1,2,3,4,5,6]
simplefunc(listofcolumns)
print listofcolumns
我得到的输出是[2,3,4,5,6]
。我的问题是,为什么不是[1,2,3,4,5,6]
?我怎么能这样做
这样我才能得到答案[1,2,3,4,5,6]
?
答案 0 :(得分:1)
因为在函数中更改可变对象参数可能会影响调用者!并将全局更改您的对象!为了获得这种行为,您可以采用以下方法之一:
所以你可以这样做:
listofcolumns = [1,2,3,4,5,6]
simplefunc(listofcolumns[:])
或者您可以将列表转换为不可变对象的元组但在您的情况下tuple
对象没有属性remove
您无法使用以下方法解决问题。
listofcolumns = [1,2,3,4,5,6],
simplefunc(tuple(listofcolumns))
答案 1 :(得分:1)
当您编写mylist = listofcolumns时,您没有创建新列表。您只是将变量mylist指向listofcolumns引用的列表。因此,您对mylist或listofcolumns所做的任何修改都会修改相同的原始列表。如果要复制列表以便可以在不弄乱原始列表的情况下对其进行修改,则可以使用.copy()方法,如下所示:
def simplefunc(listofcolumns):
mylist = listofcolumns.copy()
mylist.remove(1)
或者你可以像Kasra建议的那样做,而不是首先传递原始列表。
正如下面的评论中所指出的,.copy()
是Python 3的新功能。对于旧版本的Python,您可以通过制作整个列表的切片来完成同样的事情:
def simplefunc(listofcolumns):
mylist = listofcolumns [:]
mylist.remove(1)
答案 2 :(得分:0)
您通过引用传递此列表。当mylist = listofcolumns
时,所有元素地址都在mylist中复制。因此,当您更改mylist时,它也会更改listofcolumns。但是当你使用mylist = listofcolumns[:]
时,它只是复制元素。
你可以试试这个:
def simplefunc(listofcolumns):
mylist = listofcolumns[:]
mylist.remove(1)
print listofcolumns
print mylist
listofcolumns = [1,2,3,4,5,6]
simplefunc(listofcolumns)
print listofcolumns