列表是否在python中不可变?它们是否在功能中传递价值?

时间:2015-12-10 05:41:23

标签: python list parameter-passing immutability

def threshold(the_list,thresholding_value,upper_val,lower_value):
    ret_list=list(the_list)
    for each_item in ret_list:
        if each_item <= thresholding_value:
            each_item=lower_value
        else:
            each_item=upper_val
    return ret_list

temp=[-1,2,5,3,-1,5,32,-6]
ttt=r.threshold(temp,0,1,0)

执行后我仍然得到列表相同的值

3 个答案:

答案 0 :(得分:1)

each_item只是一个局部变量,其值被=运算符覆盖。为其分配值不会影响原始列表。相反,您可以创建一个新列表并在返回之前填写它:

def threshold(the_list, thresholding_value, upper_val, lower_val):
    ret_list = list()
    for each_item in the_list:
        if each_item <= thresholding_value:
            ret_list.append(lower_val)
        else:
            ret_list.append(upper_val)
    return ret_list

您还可以使用列表推导显着缩短此代码:

def threshold(the_list, thresholding_value, upper_val, lower_val):
    return [lower_val if x <= thresholding_value else upper_val for x in the_list]

答案 1 :(得分:1)

列表不是不可变的,但是当你循环遍历一个时,循环控制变量会得到每个项目的副本;它不是它的别名。因此,更改它不会影响列表。

更多Pythonic方法是返回新列表的列表理解:

final Response response = mock(Response.class);
    when(response.getStatus()).thenReturn(201);

    when(builder.post(Entity.entity(myRequest, MediaType.APPLICATION_JSON)))
            .thenReturn(response);
    Response responsetest =updatedetails("a",
            Details, id, "single", "foo", "foo1");

答案 2 :(得分:0)

列表绝对是可变的。你会在列表上进行迭代,每个元素依次复制到SELECT CompanyName, COUNT(DISTINCT CaseID) FROM Company co JOIN Workers w ON co.CompanyId = w.CompanyId JOIN Cases ca ON w.WorkerId IN (ca.Worker1, ca.Worker2, ca.Worker3) GROUP BY CompanyName 。 each_item会发生什么与列表无关,因为它只是一个临时变量来保存您的值,而不是指针。

将each_item表示为1元素列表或类将解决您的问题,但整个方法不是通常在python中完成的方式:为什么在为返回值创建空列表时创建列表副本你去的时候添加元素?