以下代码正在查找排列,但count
变量未更新。任何人都可以指出错误,为什么count
的变化没有反映出来。
def swap_arr_elems(arr, src_idx, dest_idx):
tmp = arr[src_idx]
arr[src_idx] = arr[dest_idx]
arr[dest_idx] = tmp
return
def permuate(arr, left, right, output, count):
if left == right:
output.append(list(arr))
count += 1
#count.append('1')
return
for i in range(left, right, 1):
swap_arr_elems(arr, left, i)
permuate(arr, left + 1, right, output, count)
swap_arr_elems(arr, left, i)
if __name__ == '__main__':
count = 0
#count = []
test_input = ['a', 'b', 'c']
test_output = []
permuate(test_input, 0, len(test_input), test_output, count)
print("count : " + str(count))
for item in test_output:
print(item)
编辑1:
output of the above code is:
count : 0
['a', 'b', 'c']
['a', 'c', 'b']
['b', 'a', 'c']
['b', 'c', 'a']
['c', 'b', 'a']
['c', 'a', 'b']
答案 0 :(得分:4)
你只是在count
时增加left==right
,然后你从它返回,增加计数不会在调用函数中自动增加它,你可以尝试返回计数然后接受它在它被调用的函数中。
示例 -
def permuate(arr, left, right, output, count):
if left == right:
output.append(list(arr))
count += 1
#count.append('1')
return count
for i in range(left, right, 1):
swap_arr_elems(arr, left, i)
count += permuate(arr, left + 1, right, output, count)
swap_arr_elems(arr, left, i)
return count
if __name__ == '__main__':
count = 0
#count = []
test_input = ['a', 'b', 'c']
test_output = []
count = permuate(test_input, 0, len(test_input), test_output, count)
print("count : " + str(count))
for item in test_output:
print(item)
答案 1 :(得分:2)
是的,count
变量的范围仅在主循环中。
count
循环中的{p> if main
变量和permuate
函数中的计数变量不同。
如果你想要来自permuate
函数的count变量值,那么从function返回计数值并在count变量中接受。
<强>演示:强>
>>> count = 10
>>> def test(count):
... count += 1
... print "In test:", id(count)
... return count
...
>>> count = test(count)
In test: 149784632
>>> count
11
答案 2 :(得分:1)
permuate
函数未返回任何值。它只是以你编写它的方式返回控制流。因此,您必须将其修改为return count
。此外,您的swap_arr_elems
函数没有做任何事情,因为它没有返回任何值。或者,您可以将count
中的变量permuate
定义为global
。
答案 3 :(得分:1)
我个人将此名称命名为可变和不可变效果不知道它的真实姓名
计数是一个整数。这是一个不可变对象,它的范围在主函数内,因此它的值不会改变
当你执行count+=1
时,会创建一个新对象并且不返回该对象
test_output 是一个List.This是一个可变对象。即使你更改了它的值,它也会在同一个列表中被更改
output.append(list(arr)) #adds to the same test_output list
有关可变和不可变对象和行为的更多见解,请参阅此link
根据@brunodesthuilliers output=output+list(arr)
更改输出。这是因为+
创建了一个新对象,请参阅下面的说明
>>> out=[1,2,3]
>>> id(out)
33535760
>>> out.append(2)
>>> id(out)
33535760
>>> out=out+[3]
>>> id(out)
33535600
答案 4 :(得分:1)
原语是不可改变的。当您尝试增加函数内的计数时,您正在切换函数内部所指的内存地址count
,外部count
未更改:
在CPython中作为实现细节,对象的id
也是内存地址,因此我们可以清楚地看到这种情况发生:
def fn(inside_count):
print id(inside_count), '- inside_count before increment'
inside_count += 1
print id(inside_count), '- inside_count after increment'
outside_count = 1
print id(outside_count), '- outside_count before fn call'
fn(outside_count)
print id(outside_count), '- outside_count after fn call'
140536048575784 - outside_count before fn call
140536048575784 - inside_count before increment
140536048575760 - inside_count after increment
140536048575784 - outside_count after fn call
列表对象的行为不同,因为您在对象上调用append函数。 inside_output引用的内存地址不会改变,内存地址的对象也会改变。
def fn(inside_output):
print id(inside_output), '- inside_output before append'
inside_output.append('1')
print id(inside_output), '- inside_output after append'
outside_output = []
print id(outside_output), '- outside_output before fn call'
fn(outside_output)
print id(outside_output), '- outside_output after fn call'
4389007440 - outside_output before fn call
4389007440 - inside_output before append
4389007440 - inside_output after append
4389007440 - outside_output after fn call
话虽如此,因为你在列表中有你的排列,你应该这样做:
print("count : " + str(len(test_output)))