函数内的Python修改列表
问题描述:
我想通过传递列表的引用来让函数修改列表。下面的程序显示了当我将一个列表传递给该函数时,仅生成了一个局部变量。有什么方法可以在函数中从列表中选择一些成员?谢谢。函数内的Python修改列表
def func(list1):
list1 = list1[2:]
print(list1) # prints [2, 3]
list1 = [0, 1, 2, 3]
func(list1)
print(list1) # prints [0, 1, 2, 3]
编辑1:我也试过使用下面的函数。它也不起作用。也许这是因为在func2中,list1变成了引用list2的局部变量。
def func2(list1):
list2 = list1[2:]
list1 = list2
print(list1) # prints [2, 3]
list1 = [0, 1, 2, 3]
func(list1)
print(list1) # prints [0, 1, 2, 3]
答
你必须返回值返回并分配给list1
:
def func(list1):
list1 = list1[2:]
print(list1) # prints [2, 3]
return list1
list1=func(list1)
,或者你必须引用list1
作为global
内func()
。
答
list1 = list[2:]
将创建一个列表,使局部变量的引用新的列表。它不影响原始列表。
使用列表切片分配得到你想要的东西:
def func(list1):
list1[:] = list1[2:]
print(list1) # prints [2, 3]
或使函数返回新的列表,并在主叫方指定的返回值:
def func(list1):
return list[2:]
list1 = [0, 1, 2, 3]
list1 = func(list1)
....
答
您已经遇到“通过名称”。您显示的代码只会改变func()指向的本地“list1”名称。如果您使用“list1”名称来更改引用内容的值,而不是将func()中的“list1”名称指向其他内容,那么该程序的其余部分将会看到该名称。
def func(list1):
del list1[0:2]
# list1 = list1[2:]
# print(list1) # prints [2, 3]
list1 = [0, 1, 2, 3]
func(list1)
print(list1)
答
选项1:不要这样做。副作用是邪恶的:)
选项2:如果必须,然后应用你的函数作为参数接收对象上破坏性的方法:
def func(list1):
list1 = list1[2:]
list1.pop(0)
list1.pop(0)
print(list1) # prints [2, 3]
list1 = [0, 1, 2, 3]
func(list1)
print(list1) # prints [2, 3]
答
请转到http://www.pythontutor.com/visualize.html可视化你的代码。它会给你一个更准确的解释。
这里是一个简短的说明,并为你的问题的两个可能的解决方案:
list1 = list1[2:]
这行创建了一个新的列表,并将其分配给FUNC命名空间局部变量列表1,而保持全球性依然。
如果你想改变原来的列表:
请使用替代方法变化(删除,弹出等),用于可发现here名单。
-
或者你可以返回这样一个新的列表:
def func(list1): list1 = list1[2:] print(list1) # prints [2, 3] return list1 list1 = [0, 1, 2, 3] list1 = func(list1) print(list1) # prints [2, 3]
希望它能帮助。
“选择一些成员”是什么意思? – 2014-12-03 05:46:38
我的意思是,从列表中只选择[2,3] 1 – 2014-12-03 05:48:03
你已经说过了。但是你没有解释这意味着什么。 – 2014-12-03 05:51:35