今天刷题刷到LeetCode上的46题:46. 全排列
很自然的写出了如下代码
class Solution(object):
def permute(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
def f(num, cur, res):
if len(cur) == len(nums):
#print cur
res.append(cur)
return
for i in range(len(nums)):
if nums[i] in cur:
continue
else:
cur.append(nums[i])
f(nums, cur, res)
cur.pop()
res = []
f(nums, [],res)
return res
结果却是 全为空 如[ [],[],[],]???
出于对自己的自信, 我偷看了别的java代码, 确认是思路没毛病的。。
可问题出在哪呢?
仔细查阅java 和Python的 函数传递规则 也没发现问题
突然灵机一动!!!
我添加了一笔 f(nums, cur[:], res), 成功跑通, 解释如下,
# 这里为什么传一个新的引用 cur[:] ?
# 因为 后边cur.pop 相当于每次把之前的值删除, res中的cur也会随之删除, 因为传递的是地址。 所以res的结果也会变!!!
# 这是java 中 与Python的不同 , res的元素和cur仍然是一个地址空间!!
简单来说: 就是res = [cur], cur = [] , 这种结构的存储, res 中的 元素和cur 指向 同一个地址空间。 所以 不是随便改变cur的, 应该了解到 res的结果也会改变, 如果不想让他改变, 那么应该重新传递一个新的值(新的地址空间),Python为了省内存, 可谓无所不用其极!!!
其实 append这个函数可以这样理解, 它 不生成新的东西, 只是做了结构上的整理!