【问题标题】:Python modifying list within functionPython修改函数内的列表
【发布时间】:2015-01-31 14:11:30
【问题描述】:

我试图让函数通过将列表的引用传递给它来修改列表。下面的程序显示当我将一个列表传递给函数时,只生成一个局部变量。有没有办法从函数中的该列表中选择一些成员?谢谢。

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 中只选择 [2, 3]
  • 你已经说过了。但你还没有解释这意味着什么。
  • 例如修改list1,使得list1只有[2,3]。丢弃前两个元素。

标签: python list function


【解决方案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】:

    您遇到了“按名称传递”。您显示的代码仅更改 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)
    

    【讨论】:

      【解决方案3】:

      你必须返回并将返回的值赋给list1

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

      或者您必须在func() 中将list1 引用为global

      【讨论】:

        【解决方案4】:

        选项 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]
        

        【讨论】:

          【解决方案5】:

          请转至http://www.pythontutor.com/visualize.html 以可视化您的代码。它会给你一个更准确的解释。

          这里有一个简短的解释和两个可能的解决方案:

          list1 = list1[2:]
          

          这一行创建一个新列表并将其分配给 func 命名空间中的局部变量 list1,同时保持全局变量不变。

          如果要更改原始列表:

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

          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]
            

          希望对你有帮助。

          【讨论】:

            猜你喜欢
            • 2014-03-30
            • 2015-10-04
            • 2014-06-19
            • 2021-08-27
            • 2018-08-29
            • 2017-07-09
            • 2020-01-27
            • 2016-03-11
            相关资源
            最近更新 更多