python - Python - 列表在不使用“return”的情况下在函数外部更新
问题描述
我有一个列表,我将其作为参数提供给函数。在函数内部,我正在更改列表,但我没有使用return
. 我正在运行该功能并随后打印列表。
预期结果:[]
实际结果:[5]
这怎么可能?
def foo(bar):
for i in range(2):
if bar == []:
bar.append(4)
else:
bar[0] += 1
myvar = []
foo(myvar)
print (myvar)
解决方案
因为空列表首先在内存位置创建,第二次它引用同一个列表而不是创建新列表。
- 第一个 bar =[] 为空。
- for 循环检查 bar 是否为空,向其添加 4。
- 现在 bar = [4] 再次检查 bar == [] 但现在它的值为 4。所以它进入 else 部分并加 1。
- 现在 bar 的值变为 5。
- 在此过程中,它指的是相同的内存位置。
下面的示例将帮助您更好地理解它,
def foo (bar = []):
bar.append('baz')
return bar
foo()
['baz']
foo()
['baz', 'baz']
foo()
['baz', 'baz', 'baz']
每次调用 foo() 时,它都会将默认值“baz”附加到现有列表中。
这是因为,函数参数的默认值仅在定义函数时计算一次。因此,bar 参数仅在首次定义 foo() 时才初始化为其默认值(即空列表),但随后调用 foo() 将继续使用 bar 最初初始化的相同列表。
推荐阅读
- android - 从 ImageView 中的图像中选择颜色 [问题]
- typescript - 如何使用 TypeScript 调试使用 Expo 创建的 React Native 项目
- unity3d - 如何在没有fps下降的情况下统一检查互联网连接
- erlang - 在 Erlang / Elixir digraph 中查找树的根
- python - 如何在 Django 中使用嵌套路由
- html - 关于 selenium/beautifulsoup html 解析的问题
- winforms - 如何在 Windows C# 中创建安装项目时添加应用程序配置文件
- wordpress - 如何在wordpress的页面模板上使用页面滚动到id插件?
- git - 詹金斯管道条件
- c# - Android C# 本地网络访问