如何解决在Python3中如何将列表作为参数传递?
当我遇到此问题时,我试图使用递归对Bubble Sort进行编码。
def bubble_sort_recur(a):
print(a)
if len(a)==1:
return
for i in range(len(a)-1):
if a[i] > a[i+1] :
a[i]=a[i]^a[i+1] # swap using XOR
a[i+1]=a[i]^a[i+1]
a[i]=a[i]^a[i+1]
print(a) # shows the changes made in the current call
bubble_sort_recur(a[:-1])
b=[1,6,1,66,3,32,21,33,1] # initial list
bubble_sort_recur(b) # function call
我认为python对对象(列表)使用按对象引用传递。还可以预期递归的输出,如下所示:
[1,1]
[1,66] # 66 bubbles up
[1,33]
[1,32]
[1,21]
[1,6]
[1,3]
[1,1]
[1]
您可以看到,第三个“ 1”会按预期下降到第二个索引。
但是当我执行print(b)
时,会得到[1,66]
,它既不是已排序列表也不是原始列表(b=[1,1]
)。
您能否解释得到这种混合行为的原因?
我试图探索的工作如下:
def func(a):
a[0]='only one altered'
def func2(b):
a=['this','is','completely','new']
a=[1,'initial',2,'array']
func(a) # this changes the list
print(a)
func2(a) # this does not change the list 'a',in any way.
print(a)
>> ['only one altered','array']
['only one altered','array']
我注意到,当我通过使用索引在函数内部更改列表的值时, actual 列表会被更改。否则,该列表不受影响。 任何帮助表示赞赏。
解决方法
您的函数不返回值,而是依赖于可变的列表才能将其更改到适当的位置。但是,您随后使用当前列表的一部分调用递归,从而创建了一个副本(因此也创建了一个新列表),因此不再引用列表b
。
您可以通过在递归前添加print(b)
行来验证这一点。
def bubble_sort_recur(a):
print(a)
if len(a)==1:
return
for i in range(len(a)-1):
if a[i] > a[i+1] :
a[i]=a[i]^a[i+1] # swap using XOR
a[i+1]=a[i]^a[i+1]
a[i]=a[i]^a[i+1]
print(a) # shows the changes made in the current call
print(b)
print()
bubble_sort_recur(a[:-1])
b=[1,6,1,66,3,32,21,33,1] # initial list
bubble_sort_recur(b) # function call
输出
[1,1]
[1,66]
[1,66] # first call changed b
[1,33]
[1,66] # none of the recursions changed b
[1,32]
[1,66]
[1,21]
[1,6]
[1,3]
[1,66]
[1]
一种解决方案是添加回叫电话。
def bubble_sort_recur(a):
if len(a) > 1:
for i in range(len(a)-1):
if a[i] > a[i+1] :
a[i],a[i+1] = a[i+1],a[i] # more pythonic syntax
# or
# a[i:i+2] = a[i+1:i-1:-1]
# or your original code
# a[i]=a[i]^a[i+1] # swap using XOR
# a[i+1]=a[i]^a[i+1]
# a[i]=a[i]^a[i+1]
print(a)
a[:-1] = bubble_sort_recur(a[:-1]) # catch the result of recursion
return a
b = [1,1] # initial list
b = bubble_sort_recur(b) # function call
[1,1]
>>> print(b)
[1,66]
,
a[:-1]
创建一个新列表,然后将其向下传递
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。