【问题标题】:Why doesn't the copy of a list in a function work?为什么函数中的列表副本不起作用?
【发布时间】:2019-04-04 13:01:26
【问题描述】:
b = [0]

def copyalist(b):
    b = [1, 2, 3]
    print(b)

copyalist(b)
print(b)

输出如下:

[1, 2, 3]
[0]

第一行表示在函数中,b被设置为[1,2,3]; 但是,当您从函数中 print(b) 时,第二个输出显示 b 仍然是 [0]。

我不明白,为什么外面的b没有改变?

我也试过 b = copy.deepcopy([1, 2, 3]),输出是一样的。

但是,下面的代码运行良好:

b = [0]

def copyalist(b):
    b += [1, 2, 3]
    print(b)

copyalist(b)
print(b)

输出如下:

[0, 1, 2, 3]
[0, 1, 2, 3]

【问题讨论】:

  • 因为在您的第一个示例中,您的函数不返回任何内容,只是打印您在其中定义的列表,一旦调用返回,它会打印具有 [0] 的原始 b 列表.没有什么神奇的。也没有任何内容被复制。
  • 在您的第二个 sn-p 中,您只是将列表与前一个列表连接/合并。没有任何内容被复制。
  • 您有两个完全不相关的变量,名为 b:一个全局变量,一个位于 copyalist() 内部的局部变量。本地 b 的初始值与全局 b 相同,但是一旦您为本地 b 分配新值,就会发生变化。
  • 确保您了解全局变量和局部变量之间的区别。此外,在函数范围内更改全局变量也不是一个好习惯。

标签: python list function


【解决方案1】:

这段代码:

def copyalist(b):
    b = [1, 2, 3]
    print(b)

仅意味着将变量名称b 重新映射到新列表,而不是修改原始b。如果要修改原始列表,则必须明确告诉 Python 替换实际内容。做法是:

def copyalist(b):
    b[:] = [1, 2, 3]
    print(b)

【讨论】:

    【解决方案2】:

    在 python 中,列表作为函数参数仅通过引用传递,即仅给出第一个元素的内存地址。在函数内部定义新的b 时,只需更改内部变量b 所指的内存位置,但外部b 仍指向原始位置。反之亦然,当您执行b += [1, 2, 3] 时,您会更改内部b 引用的单元格内的内容,并且由于内部b 指向相同的单元格,它反映在外部b 的更改中也是。

    【讨论】:

      【解决方案3】:

      这是由于全局变量和局部变量的不同。您可以将全局添加到您的函数中以获得所需的结果。

      b = [0]
      
      def copyalist():
          global b
          b = [1, 2, 3]
          print(b)
      
      copyalist()
      print(b)
      

      输出

      [1, 2, 3]
      [1, 2, 3]
      

      更深入的总结是here

      【讨论】:

        【解决方案4】:
        b = copyalist(b) 
        

        并在函数中返回 b

        def copyalist(b):
            b = [1, 2, 3]
            return(b)
        

        当您在函数中定义某些内容时,它仅在该函数内部使用。

        【讨论】:

          猜你喜欢
          • 2015-11-06
          • 2012-02-13
          • 1970-01-01
          • 1970-01-01
          • 2012-05-14
          • 1970-01-01
          • 2014-08-06
          • 2015-02-20
          • 2021-08-20
          相关资源
          最近更新 更多