我试图让一个函数通过传递列表的引用来修改列表。下面的程序显示当我将列表传递给函数时,只生成一个局部变量。有没有办法在函数中从该列表中选择一些成员?谢谢。
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]
Edit1:我也尝试使用以下功能。它也不起作用。也许它是因为在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]
答案 0 :(得分:2)
您必须返回并将返回的值分配给list1
:
def func(list1):
list1 = list1[2:]
print(list1) # prints [2, 3]
return list1
list1=func(list1)
或者您必须在list1
内引用global
作为func()
。
答案 1 :(得分:1)
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)
....
答案 2 :(得分:1)
您已经遇到过"通过名字"。您显示的代码只会改变" list1"名称是func()指向的本地名称。如果您使用" list1" name来改变所引用内容的值,而不是指向" list1"将func()中的名称命名为其他内容,然后程序的其余部分将会看到它。
def func(list1):
del list1[0:2]
# list1 = list1[2:]
# print(list1) # prints [2, 3]
list1 = [0, 1, 2, 3]
func(list1)
print(list1)
答案 3 :(得分:1)
选项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]
答案 4 :(得分:1)
请转到http://www.pythontutor.com/visualize.html以查看您的代码。它会给你一个更准确的解释。
以下是一个简短的解释和两个可能的解决方案:
list1 = list1[2:]
此行创建一个新列表并将其分配给func命名空间中的本地变量list1 ,同时保持全局列表静止。
如果您想更改原始列表:
请使用更改地方法(删除,弹出等)查找可以找到的列表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]
希望它有所帮助。