使用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
创建为列表列表,而应该创建