【问题标题】:What did "append" do to my parameter outside the function?“追加”对函数外的参数做了什么?
【发布时间】:2021-05-06 19:25:32
【问题描述】:

举个简单的例子:

def change(a,b=[]):
    a+=1
    b.append(1)
A = 1
B = []

猜猜如果我们:

change(A,B)
print(A, B)

2 [1]

函数外的参数B,变了!

但是为什么 b.append(1)会影响函数外的参数呢?

【问题讨论】:

  • 这是一个众所周知的问题——已经被问过上千次了——你可以在Python mutable list as argument上快速搜索~
  • 您可以通过 pythontutor.com 等可视化平台运行代码以查看发生了什么。

标签: python-3.x list append


【解决方案1】:

Python 列表是对象(就像 Python 中的所有其他内容一样)。当您将列表传递给函数时,实际上是在传递对列表实例的引用(存储在B 中的同一实例)。 append 是一种将对象附加到列表实例的列表方法。由于Bb 都指向同一个列表实例,所以当只有一个时它们都会更新。

【讨论】:

    【解决方案2】:

    正如@Daniel Hao 所说,你可以找到臭名昭著的问题here的详细解释

    你应该:

    def append_to(element, to=None):
        if to is None:
            to = []
        to.append(element)
        return to
    

    【讨论】:

    • 问题中显示的代码实际上并没有使用默认值!它具有完全相同的行为,没有默认值或占位符。
    • 正确什么?你已经有了一个解释发生了什么的答案。
    • 啊哈,我以为你的意思是问题本身有错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    • 2021-04-26
    • 1970-01-01
    • 2020-09-08
    • 2012-06-11
    • 2011-10-12
    • 2012-10-22
    相关资源
    最近更新 更多