我有一个简单的例子。 函数 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;]
答案 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)