使用append方法和+;运算符在Python中生成不同的结果?

使用append方法和+;运算符在Python中生成不同的结果?,python,Python,当我使用mylist+[newmember]语法时,我的算法非常有效 class Node: def __init__( self, label, value, child1=None, child2=None ): self.label = label self.val = value self.children = [] if child1 != None: self.children.appen

当我使用
mylist+[newmember]
语法时,我的算法非常有效

class Node:
    def __init__( self, label, value, child1=None, child2=None ):
        self.label = label
        self.val = value
        self.children = []
        if child1 != None:
            self.children.append( child1 )
        if child2 != None:
            self.children.append( child2 )

b = Node( 'b', 3 )
c = Node( 'c', 12 )
a = Node( 'a', 5, b, c )

def check( path, item, slns ):
    node = path[ -1 ]
    if node.val == item:
        slns.append( path )
    if len( node.children ) > 0:
        for i in node.children:
            check( path + [ i ], item, slns )                       # <<<< This works!

def search( root, item ):
    slns = []
    check( [ root ], item, slns )
    return slns

resultpath = search( a, 12 )
for i in resultpath:
    for j in i:
        print( j.label )

我在这个网站上读到的其他答案让我相信,当添加项目而不是列表时,除了性能差异之外,添加列表的两种方式是等效的。您能解释一下为什么
path.append(i)
path+[i]
在这种情况下会产生不同的结果,以及为什么会发生这种错误吗?

区别在于
lst.append(item)
附加到现有列表(就地)中,并返回
,而
+/code>操作符(
\uuuuuuuuuuuuuuuuuuuuu
)返回连接的结果(一个新列表)


因此,当您调用
check(path.append(i),item,slns)
时,您确实修改了列表
path
,但实际上您调用了
check(None,item,slns)
而不是将新列表作为第一个参数。

区别在于
lst.append(item)
项添加到现有列表中(就地)并返回
None
,而
+
运算符(
\uuuuuuu add\uuuuuu
)返回连接的结果(一个新列表)


因此,当您调用
check(path.append(i),item,slns)
时,您确实修改了列表
path
,但实际上您调用了
check(None,item,slns)
而不是将新列表作为第一个参数。

区别在于
lst.append(item)
项添加到现有列表中(就地)并返回
None
,而
+
运算符(
\uuuuuuu add\uuuuuu
)返回连接的结果(一个新列表)


因此,当您调用
check(path.append(i),item,slns)
时,您确实修改了列表
path
,但实际上您调用了
check(None,item,slns)
而不是将新列表作为第一个参数。

区别在于
lst.append(item)
项添加到现有列表中(就地)并返回
None
,而
+
运算符(
\uuuuuuu add\uuuuuu
)返回连接的结果(一个新列表)

因此,当您调用
check(path.append(i),item,slns)
时,您确实修改了列表
path
,但实际上您调用
check(None,item,slns)
而不是将新列表作为第一个参数。

list.append()
是一个就地操作,它不返回任何内容,因此该调用返回
None

当你这样做的时候-

check( path.append( i ), item, slns )
实际上,您正在将
path.append()
的返回值发送到
check()
,而
path.append()
的返回值为None,因此您将
None
作为第一个参数发送,从而导致问题

我想说,如果第一种方法有效,它看起来会更干净。当您使用
path.append()
时,它最终会将
path
对象追加到位,并且由于您没有在任何地方创建新的path
列表,它将始终更新相同的path对象,并且最终会得到错误的结果

执行
list+list1
操作时,将创建一个新列表,表达式将返回该列表


另外,一个建议是,不要将
slns
创建为列表列表,而是使用
slns.extend(path)
创建一个简单列表,然后将其视为一个简单列表,例如-

def check( path, item, slns ):
    node = path[ -1 ]
    if node.val == item:
        slns.extend( path )
    if len( node.children ) > 0:
        for i in node.children:
            check( path + [ i ], item, slns )                       # <<<< This works!

def search( root, item ):
    slns = []
    check( [ root ], item, slns )
    return slns

resultpath = search( a, 12 )
for i in resultpath:
    print( i.label )
def检查(路径、项目、SLN):
节点=路径[-1]
如果node.val==项:
slns.extend(路径)
如果len(node.children)>0:
对于node.children中的i:
check(path+[i],item,sln)
list.append()
是一个就地操作,它不返回任何内容,因此该调用返回
None

当你这样做的时候-

check( path.append( i ), item, slns )
实际上,您正在将
path.append()
的返回值发送到
check()
,而
path.append()
的返回值为None,因此您将
None
作为第一个参数发送,从而导致问题

我想说,如果第一种方法有效,它看起来会更干净。当您使用
path.append()
时,它最终会将
path
对象追加到位,并且由于您没有在任何地方创建新的path
列表,它将始终更新相同的path对象,并且最终会得到错误的结果

执行
list+list1
操作时,将创建一个新列表,表达式将返回该列表


另外,一个建议是,不要将
slns
创建为列表列表,而是使用
slns.extend(path)
创建一个简单列表,然后将其视为一个简单列表,例如-

def check( path, item, slns ):
    node = path[ -1 ]
    if node.val == item:
        slns.extend( path )
    if len( node.children ) > 0:
        for i in node.children:
            check( path + [ i ], item, slns )                       # <<<< This works!

def search( root, item ):
    slns = []
    check( [ root ], item, slns )
    return slns

resultpath = search( a, 12 )
for i in resultpath:
    print( i.label )
def检查(路径、项目、SLN):
节点=路径[-1]
如果node.val==项:
slns.extend(路径)
如果len(node.children)>0:
对于node.children中的i:
check(path+[i],item,sln)
list.append()
是一个就地操作,它不返回任何内容,因此该调用返回
None

当你这样做的时候-

check( path.append( i ), item, slns )
实际上,您正在将
path.append()
的返回值发送到
check()
,而
path.append()
的返回值为None,因此您将
None
作为第一个参数发送,从而导致问题

我想说,如果第一种方法有效,它看起来会更干净。当您使用
path.append()
时,它最终会将
path
对象追加到位,并且由于您没有在任何地方创建新的path
列表,它将始终更新相同的path对象,并且最终会得到错误的结果

执行
list+list1
操作时,将创建一个新列表,表达式将返回该列表


另外,一个建议是,不要将
SLN
创建为列表列表,而应该创建