【问题标题】:append method in python not working as expected in nested for loopspython中的append方法在嵌套for循环中没有按预期工作
【发布时间】:2020-10-18 01:19:05
【问题描述】:

我想使用嵌套的 for 循环将一个列表附加到另一个列表中,但代码没有按预期工作

def apend():
    ls = []
    numbers = [0,0]
    
    for num1 in range(3):
        for num2 in range(2):
            numbers[0] = num1
            numbers[1] = num2
            ls.append(numbers)
    print(ls)

apend()

我希望输出是:[[0,0],[0,1],[0,2],1,0],[1,1],[1,2]]

但我得到这个输出:[[1, 2], [1, 2], [1, 2], [1, 2], [1, 2], [1, 2]]

【问题讨论】:

  • 我认为它与docs.python-guide.org/writing/gotchas/#late-binding-closures 有关。也许尝试在你的内部 for 循环中实例化 numbers
  • 您将在每次迭代中附加对同一列表的引用。只需附加 [num1, num2] 即可。
  • 谁能解释一下为什么这不起作用
  • ls 将其作为对相同numbers 的引用,但您应该在将其放入ls 之前创建新的number。或执行ls.append([num1, num2]) BTW:在pythontutor.com 上运行您的代码,您将在可视化上看到以箭头表示的引用 - 并且所有箭头都指向同一列表number

标签: python list loops append nested-loops


【解决方案1】:

只需将数字更改为 numbers[:],您就会得到预期的输出。

ls.append(numbers) 表示您正在附加列表的引用。 所以当列表发生变化时,所有实例都会发生变化。 当您执行 ls.append(numbers[:]) 时,这会附加一个数字副本。

def apend():
    ls = []
    numbers = [0,0]
    
    for num1 in range(3):
        for num2 in range(2):
            numbers[0] = num1
            numbers[1] = num2
            ls.append(numbers[:])
    print(ls)

apend()

【讨论】:

    【解决方案2】:

    您正在循环中附加名为 numbers 的列表。 只需附加一个新的列表对象,如下所示。

    def apend():
        ls = []
        numbers = [0,0]
        
        for num1 in range(3):
            for num2 in range(2):
                numbers[0] = num1
                numbers[1] = num2
                ls.append(list(numbers)) # append a new list object 
        print(ls)
    

    顺便说一下,我想对这个函数使用列表推导。

    def append():
        ls = [[x, y] for x in range(3) for y in range(2)]
        print(ls)
    

    【讨论】:

      【解决方案3】:

      你可以这样做:

      def apend():
          ls=[]
          numbers=[0,0]
          for num1 in range(3):
              for num2 in range(2):
                  numbers[0]=num1
                  numbers[1]=num2
                  ls.append(num.copy())
          print(ls)
      apend()
      

      【讨论】:

        【解决方案4】:

        如果您在 http://pythontutor.com/ 上运行您的代码,那么您会看到

        列表ls 中的所有元素都引用同一个列表numbers,这会产生问题。

        您必须在for-loop 中创建新列表numbers = [0,0]

        for num1 in range(3):
            for num2 in range(2):
                numbers = [0,0]
                numbers[0] = num1
                numbers[1] = num2
                ls.append(numbers)
        

        或者干脆不用numbers

        for num1 in range(3):
            for num2 in range(2):
                ls.append([num1, num2])
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-12-27
          • 1970-01-01
          • 2021-04-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多