为什么我不能在方法中更改列表?

时间:2016-02-18 15:24:05

标签: python

我有一个不包含循环的方法。我将列表传递给该方法。我为每个代码段分配了一个新值:

def do_paging(pageable_list):
    pageable_list = pageable_list[start:end]

在主叫代码中:

do_paging(source_list)

但看起来source_list似乎没有变化。如果我从pageable_list返回do_paging(),一切都很棒。数组参数是不可变的吗?

我开始返回值,因为它更好。但我很惊讶,想知道发生了什么。

编辑 - 我怎么可能编程Python一年而且不知道这个!

3 个答案:

答案 0 :(得分:5)

切片正在创建一个新列表:

$query = mysqli_query($conn, "insert ignore into macadd (mac)
select volley.mac from volley
inner join savedemail on savedemail.email = volley.email");

您没有改变原始列表:

>>> a = [1,2,3]
>>> b = a[1:2]
>>> a is b
False

此外,对于您在>>> a [1, 2, 3] 函数中为名称pageable_list指定的列表,您永远不会做任何事情。

所以问题是a)你没有修改原始列表和/或b)你没有从你的功能中返回任何东西。使代码工作的一种方法是创建切片并将名称do_paging重新分配给函数的返回值,即:

pageable_list

该函数也应该采用def do_paging(pageable_list, start, end): return pageable_list[start:end] pageable_list = do_paging(pageable_list, start, end) start个参数,寻找全局空间中的那些是丑陋的。

但是,如果所有你需要的功能都是切片,那么这个功能并没有用,你只需要使用这行

end

答案 1 :(得分:3)

当我最近审核code from Quantopian并且以前从未使用过时,我注意到了这种方法。根据@Steven_Rumbalski的评论,这会将切片分配回输入变量pageable_list

def do_paging(pageable_list, start, end):
    pageable_list[:] = pageable_list[start:end]

a = [1, 2, 3, 4, 5]

do_paging(a, 2, 4)

>>> a
[3, 4]

答案 2 :(得分:2)

您没有更改“列表”。您正在为本地变量分配新值。

改变列表本身是可行的:

def do_paging(pageable_list):
    pageable_list.pop()

但变量pageable_list仅仅是一个局部变量,并为其分配一些新值不会修改先前分配给它的值。