Python 无法将总和为0的3个数字放入列表中

Python 无法将总和为0的3个数字放入列表中,python,Python,名为myList的列表未更新 我在函数中定义它,并在函数中使用它 class Solution: def threeSum(self, nums: List[int]) -> List[List[int]]: myList = [] a = [] for i in range(len(nums)): # print("---i",nums[i]) # print(a[0])

名为
myList
的列表未更新

我在函数中定义它,并在函数中使用它

class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        myList = []
        a = []
        for i in range(len(nums)):
           # print("---i",nums[i])
        #    print(a[0])
            for j in range(i+1,len(nums)):
             #   print("----j",nums[j])
                for k in range(i+2,len(nums)):
                #    print("-----k",nums[k])
                    if nums[i]+nums[j]+nums[k] == 0:
                        print("m into it now for i",nums[i],"j",nums[j],"k",nums[k])
                        print("oooo",myList)
                        a.append(nums[i])
                        a.append(nums[j])
                        a.append(nums[k])
                  #      print(myList)
                        myList.append(a)
                        print("....",myList)
                        print("---",a)
                        a.clear()
        print(myList)
将输出获取为:

[[], [], [], []]

Python将一切都视为对象。 当您有如下列表时:

my_list = [1,2,3]
这里的
my_list
是对存储在内存中的列表
[1,2,3]
的引用

现在,如果您将
my_list
传递给任何其他函数,或者在任何其他对象中使用它,就像您在
myList
中附加了
a
,那么这里基本上python使用它作为原始列表的参考。现在,
myList
已将
a
的引用存储在其中。 这就是为什么当您清除
a
的内容时,它也会影响
myList
的内容

您不必清除列表
a
的内容。只要像这样在
循环中每次重新初始化它

class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        myList = []
        for i in range(len(nums)):
           # print("---i",nums[i])
           # print(a[0])
            for j in range(i+1,len(nums)):
             # print("----j",nums[j])
                for k in range(i+2,len(nums)):
                    # print("-----k",nums[k])
                    if nums[i]+nums[j]+nums[k] == 0:
                        print("m into it now for i",nums[i],"j",nums[j],"k",nums[k])
                        print("oooo",myList)
                        a = []
                        a.append(nums[i])
                        a.append(nums[j])
                        a.append(nums[k])
                        # print(myList)
                        myList.append(a)
                        print("....",myList)
                        print("---",a)
        print(myList)
更新: 正如Artog在评论中提到的


通过在函数末尾运行
print(list(map(hex,map(id,myList)))
可以很容易地看到这一点。这将表明,对于原始代码的所有条目,内存地址都是相同的,但与新代码不同。

Python将所有内容都视为对象。 当您有如下列表时:

my_list = [1,2,3]
这里的
my_list
是对存储在内存中的列表
[1,2,3]
的引用

现在,如果您将
my_list
传递给任何其他函数,或者在任何其他对象中使用它,就像您在
myList
中附加了
a
,那么这里基本上python使用它作为原始列表的参考。现在,
myList
已将
a
的引用存储在其中。 这就是为什么当您清除
a
的内容时,它也会影响
myList
的内容

您不必清除列表
a
的内容。只要像这样在
循环中每次重新初始化它

class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        myList = []
        for i in range(len(nums)):
           # print("---i",nums[i])
           # print(a[0])
            for j in range(i+1,len(nums)):
             # print("----j",nums[j])
                for k in range(i+2,len(nums)):
                    # print("-----k",nums[k])
                    if nums[i]+nums[j]+nums[k] == 0:
                        print("m into it now for i",nums[i],"j",nums[j],"k",nums[k])
                        print("oooo",myList)
                        a = []
                        a.append(nums[i])
                        a.append(nums[j])
                        a.append(nums[k])
                        # print(myList)
                        myList.append(a)
                        print("....",myList)
                        print("---",a)
        print(myList)
更新: 正如Artog在评论中提到的


通过在函数末尾运行
print(list(map(hex,map(id,myList)))
可以很容易地看到这一点。这将显示所有具有原始代码的条目的内存地址相同,但与新条目不同。

您可以通过在函数末尾运行
print(list(map(hex,map(id,myList)))
来轻松看到这一点。这将显示所有具有原始代码的条目的内存地址相同,但与新的不同。您可以通过在函数末尾运行
print(list(map(hex,map(id,myList)))
来轻松看到这一点。这将显示内存地址对于所有具有原始代码的条目都是相同的,但与新条目不同,与您的问题无关,但如果您想迭代所有组合,它应该是范围(j+1,len(nums))中的
k吗?
与您的问题无关,但应该是范围(j+1,len(nums))中的
k吗
如果要迭代所有组合?