gpt4 book ai didi

python - path = path + [node1], path += [node1] 和 path.append(node1) 的区别

转载 作者:行者123 更新时间:2023-11-28 17:22:05 29 4
gpt4 key购买 nike

我想弄清楚两者之间的区别

  1. 路径=路径+[节点1]
  2. 路径+=[节点1]
  3. path.append(node1)

我得到的是 path = path + [node1] 的正确路径,但不是其他两个。

def find_path(self, node1, node2, path = []):
""" Finds any path from node1 to node2 which may not be the shortest """

path = path + [node1]
if node1 == node2:
return path
if node1 not in self._graph:
return None
for node in self._graph[node1]:
if node not in path:
new_path = self.find_path(node, node2, path)
if new_path:
return new_path
return None

最佳答案

使用可变默认参数时,您需要非常小心。请看“Least Astonishment” and the Mutable Default Argument .

造成行为差异的原因在于

path = path + [node1]

创建一个新列表并将其绑定(bind)到名称 path。其他 2 个备选方案修改绑定(bind)到 path 的现有列表。


正如链接问题所解释的,默认参数是在编译函数定义时创建的,不是在调用函数时创建的。这在递归函数中使用可变默认 arg 时尤为重要,因为它意味着默认 arg 不会在每次顶级递归调用时重置。

如果您不想使用可变默认参数给您带来的“特殊”行为,您可以这样做:

def find_path(self, node1, node2, path=None):
if path is None:
path = []
# rest of code

如果 Nonepath 的有效参数,那么您需要使用其他一些标记,例如

sentinel = object()
def find_path(self, node1, node2, path=sentinel):
if path is sentinel:
path = []
# rest of code

这是一个简短的演示,它说明了可变默认 arg 的“特殊”行为。您可以看到 lst 记住了它以前的内容。

def test(a, lst=[]):
lst += [a]
print(a, lst)

for i in range(5):
test(i)

输出

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

相比之下,使用 lst = lst + [a],我们创建一个新列表而不是附加到默认列表。

def test(a, lst=[]):
lst = lst + [a]
print(a, lst)

for i in range(5):
test(i)

输出

0 [0]
1 [1]
2 [2]
3 [3]
4 [4]

关于python - path = path + [node1], path += [node1] 和 path.append(node1) 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40945758/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com