繁体   English   中英

函数中的Python修改列表

[英]Python modifying list within function

我正在尝试让函数通过将列表的引用传递给它来修改列表。 下面的程序显示了当我将列表传递给函数时,仅生成一个局部变量。 有什么方法可以从函数中的列表中选择一些成员? 谢谢。

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]

您必须返回并将返回的值分配给list1

def func(list1):
    list1 = list1[2:]    
    print(list1)   # prints [2, 3]
    return list1

list1=func(list1)

或者您必须引用list1作为func() 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名称空间中的局部变量list1 ,同时保持全局列表不变 在此处输入图片说明

如果要更改原始列表:

  1. 请使用就地更改方法 (删除,弹出等)获取可在此处找到的列表。

  2. 或者您可以返回像这样的新列表:

     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] 

希望能帮助到你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM