代码之家  ›  专栏  ›  技术社区  ›  Beatrix Kidco

蟒蛇pop()全局更改本地列表?[副本]

  •  2
  • Beatrix Kidco  · 技术社区  · 7 年前

    我在代码中遇到一个错误,搜索后发现。函数的作用是:在全局级别更改局部函数中的列表值,而不使用返回函数或全局语句。我了解pop的作用,我以前使用过它,但我不明白为什么它会影响列表的全球价值。为什么会这样?是否有此名称,是否有其他功能也有相同的名称?

    #Example code
    listname=[1,2,3,4,5]
    
    def checkpop(listname):
        popped = listname.pop()
        listname = ['WTF']
        print (listname)
    
    print(listname)
    checkpop(listname)
    print(listname)
    

    输出

    [1, 2, 3, 4, 5]

    ['WTF']

    [1, 2, 3, 4]

    2 回复  |  直到 5 年前
        1
  •  1
  •   heemayl    7 年前

    因为赋值不会生成Python中任何对象的任何新副本。所以,当你通过 全球的 list作为函数的参数,绑定到函数内的同一个list对象。

    由于列表在Python中是可变的,当您在其中执行就地操作时,您正在更改相同的列表 全球的 列出对象。

    为了更好地掌握,您可以随时检查 id :

    In [45]: lst = [1, 2]
    
    In [46]: def foo(lst):
        ...:     print(id(lst))
        ...:     return   
    
    In [47]: id(lst)
    Out[47]: 139934470146568
    
    In [48]: foo(lst)
    139934470146568
    
        2
  •  1
  •   Chris    7 年前

    你在对象和 listname 变量 引用和对象 列表名称 参数 指。

    这个 列表名称 变量类似于标记。它只是对列表对象的引用 [1, 2, 3, 4, 5] . 当你经过的时候 列表名称 进入 checkpop ,你给了 列表名称 参数对同一列表对象的引用 列表名称 变量引用 . 这里的重点是 列表名称 变量和 列表名称 参数指向同一对象 . 因此,改变对象 列表名称 参数引用, 也将 更改全局 列表名称 变量引用。