python:更改子例程中的列表值

时间:2015-01-30 20:40:44

标签: python list subroutine function-parameter

我有一个简单的例子。 函数 test_list_change 应该更改作为参数传递给它的列表。 在这个函数中,有一个子例程 test_list_change_2 的调用,它应该改变相同的列表。

问题是,结果列表不包含 test_list_change_2 子例程所做的更改

为什么会这样?

以下是示例:

def test_list_change(lst):
    if len(lst) < 3:
        lst.append("the last one")
        test_list_change_2(lst)

def test_list_change_2(lst):
    lst = ["the very last one"]

string_list = ["first", "another one"]
test_list_change(string_list)
print (string_list)

输出:

  

[&#39;首先&#39;,&#39;另一个&#39;,&#39;最后一个&#39;]

5 个答案:

答案 0 :(得分:3)

您需要实际更改原始list/object

def test_list_change(lst):
    if len(lst) < 3:
        lst.append("the last one")
        test_list_change_2(lst)

def test_list_change_2(lst):
    lst[:] = ["the very last one"] # changes original list object

string_list = ["first", "another one"]
test_list_change(string_list)
print (string_list)
['the very last one']

如果你想改变元素:

def test_list_change_2(lst):
    lst[:-1] = ["the very last one"]
    lst[:] = lst[::-1]

string_list = ["first", "another one"]
test_list_change(string_list)
print (string_list)
['the last one', 'the very last one']

您可以按照自己喜欢的方式操作列表,但是您需要实际引用原始列表对象,重新分配名称不会更改它只是将该名称分配给另一个对象。

答案 1 :(得分:1)

你可能很困惑python中的东西是如何工作的&#34;通过引用&#34;并认为既然它是通过引用传递的,那么原始列表应该更新为[&#34;最后一个&#34;]。

它的工作方式如下:

1)在调用test_list_change之前,有一个名称&#34; string_list&#34;和python创建一个对象[&#34;第一个&#34;,&#34;另一个&#34;]分配给string_list

2)现在在test_list_change中,一个新名称&#34; lst&#34;分配[&#34;第一个&#34;,&#34;另一个&#34;]。所以现在两个名称都分配了相同的对象。然后将其附加并更改为[&#39; first&#39;,&#39;另一个&#39;,&#39;最后一个&#39;],由string_list和lst

指向

3)在test_list_change_2中,在进行作业之前,存在另一个本地名称,该名称指向[&#34;第一个&#34;,&#34;另一个&#34;,&#39;最后一个& #39]。然后python创建另一个对象[&#39;变化的最后一个&#39;]并替换本地lst变量的值。

4)string_list仍然指向[&#39; first&#39;,&#39;另一个&#39;,&#39;最后一个&#39;]

另一种说法是,变量只是传递的名称,对象是通过引用来管理的。

答案 2 :(得分:0)

您需要在["the very last one"]中返回test_list_change_2

def test_list_change_2():
    return ["the very last one"]

并在第一个函数中将函数的结果赋给lst

def test_list_change(lst):
    if len(lst) < 3:
        lst.append("the last one")
        lst= test_list_change_2()

请注意,实际上你不需要这里的功能!你可以在第一个函数中完成这个任务。

答案 3 :(得分:0)

您的test_list_change2程序正在执行lst = ['the very last one']。它只是将新对象分配给本地名称lst。它对传递给该程序的列表没有任何影响。

我不确定你要完成什么。如果您希望将test_list_change2添加到lst,只需将其添加即可。你能说清楚吗?

答案 4 :(得分:0)

如果你想在列表中找到“最后一个”,那么:

def test_list_change(lst):
    if len(lst) < 3:
        lst.append("the last one")
    lst = test_list_change_2(lst)

def test_list_change_2(lst):
    for i in range(len(lst)):
        lst.pop()
    lst.append("the very last one")


string_list = ["first", "another one"]
test_list_change(string_list)
print (string_list)