什么是python通过引用传递不起作用?

What is python pass by reference not working?

提问人:Rishabh Sharma 提问时间:5/26/2022 最后编辑:OneCricketeerRishabh Sharma 更新时间:5/26/2022 访问量:59

问:

我有一个生成数组排列的解决方案,如下所示:

class Solution:
    
    def permuteHelper(self,li,nums,ji,x):
        if len(ji)==x:
            li.append(ji)
            return
        for i in range(len(nums)):
            ji.append(nums[i])
            self.permuteHelper(li,nums[:i]+nums[i+1:],ji,x)
            ji.pop()

    def permute(self, nums: List[int]) -> List[List[int]]:
        li = []
        ji = []
        self.permuteHelper(li,nums,ji,len(nums))
        return li

想法是使用另一个数组,将原始数组中的每个元素逐个附加,在附加元素之前跳过。但是当这样做时,我得到了空列表列表的输出。

在网上,我看到有人做同样的事情,只是他们这样做了:

class Solution:
    
    def permuteHelper(self,li,nums,ji,x):
        if len(ji)==x:
            li.append(ji)
            return
        for i in range(len(nums)):
            self.permuteHelper(li,nums[:i]+nums[i+1:],ji+[nums[i]],x)

    def permute(self, nums: List[int]) -> List[List[int]]:
        li = []
        ji = []
        self.permuteHelper(li,nums,ji,len(nums))
        return li

我不知道为什么他们的解决方案有效而我的解决方案无效,我的逻辑与他们相同,但我不明白其中的区别。有人可以解释为什么第二个有效而第一个无效吗?

Python 递归 传递引用

评论

1赞 Karl Knechtel 5/26/2022
我无法理解你打算让代码做什么(输入会是什么样子,预期的输出应该是什么?),它应该如何完成该任务,或者任何变量名称应该代表什么。此外,似乎此代码是类的一部分,但我不明白该类的预期目的是什么,或者为什么不直接编写普通函数来执行任务。
0赞 Karl Knechtel 5/26/2022
也就是说,Python 没有按引用传递,也没有按值传递。它具有按名称传递,与 C# 中的类类型(没有或)或 Java 中的非原始类型相同。请看 nedbatchelder.com/text/names1.htmlrefout
2赞 Anentropic 5/26/2022
您的答案将在运行时同时发生变异,而他们的答案只会发生变异,并且每次调用lijilijipermuteHelper
2赞 OneCricketeer 5/26/2022
你能解释一下如何以及是相同的逻辑吗?一个更新相同的列表。另一个返回一个新的。append+
1赞 juanpa.arrivillaga 5/26/2022
@KarlKnechtel因此,从技术上讲,它被称为“共享呼叫”。“按名称传递”意味着“按名称调用”,这是 Python 绝对不支持的。“通过共享调用”不是被广泛使用,但你会听到诸如“按赋值传递”、“按对象引用传递”、“按对象传递”之类的话(例如,在 Ned Batchelder 链接中,它说“有些人称之为按对象调用,或按赋值调用。

答: 暂无答案