首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >f()+f()给出[3,3,3,3],为什么不[3,3,3]

f()+f()给出[3,3,3,3],为什么不[3,3,3]
EN

Stack Overflow用户
提问于 2018-04-12 03:40:33
回答 2查看 71关注 0票数 2
代码语言:javascript
运行
复制
def f(x=[ ]):
     x +=[3]
     return x

print(f()+f())
print(f())

输出:

First:

[3,3,3,3]

第二版:

[3,3,3]

EN

回答 2

Stack Overflow用户

发布于 2018-04-12 03:50:35

由于python的默认参数,因此在程序启动时只能绑定一次。因此,对于f()的第一个调用,它返回[3]并更改x引用[3]的数组。

所以

代码语言:javascript
运行
复制
print([3]+f())
print(f())

然后,对f()的第二个调用,因为[]已经更改为[3],结果将是[3,3],引用下的数组也将被更改。

所以

代码语言:javascript
运行
复制
print([3,3]+[3,3])
print(f())

类似于下一行。它将返回[3,3] + [3]

代码语言:javascript
运行
复制
print([3,3]+[3,3])
print([3,3,3])

你就是这样得到它的。

票数 2
EN

Stack Overflow用户

发布于 2018-04-12 03:48:29

f()+f()的输出之所以是[3,3,3,3],是因为将相同的对象x添加到自己中。

让我们把它分解:

在第一次调用f() -> x=[3]之后。

在第二次调用f() -> x=[3,3]之后

现在f()+f() = x+x = [3,3] + [3,3] = [3,3,3,3]

也许演示的一种方法是修改函数以打印id(x)

代码语言:javascript
运行
复制
def f(x=[ ]):
    x +=[3]
    print(id(x))
    return x
print(f()+f())
#4370444584
#4370444584
#[3, 3, 3, 3]

如果希望它输出[3,3,3],则必须让函数返回x的副本

代码语言:javascript
运行
复制
def f(x=[ ]):
    x +=[3]
    return [val for val in x]


print(f()+f())
#[3,3,3]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49787617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档