不断收到“自我未定义”错误,但缩进似乎还可以

时间:2018-09-02 04:00:07

标签: python python-3.x self

def twoSum(self, nums, target):
    """
    :type nums: List[int]
    :type target: int
    :rtype: List[int]
    """

    # sort the given array
    sorted_nums = sorted(self.nums)
    # take two indices i,j
    i = 0 #start
    j = len(sorted_nums)-1 #end

    s = sorted_nums[i]+sorted_nums[j] 

    while s != self.target:
        # move j to left if sum > target (to decrease sum) 
         if s > self.target:
            j-=1
         else:
            i+=1 # move i to right if sum < target (to increase sum)
    s = sorted_nums[i]+sorted_nums[j]
    # return corresponding indices of elements in original array
    x = self.nums.index(sorted_nums[i])
    # change value at x to avoid referring to same element twice
    self.nums[x] = -1
    y = self.nums.index(sorted_nums[j])
    return [y,x]

if __name__=='__main__':
    target = input('What is the target?')
    nums = [int(x) for x in input('Input list: x y z ...').split()]
    twoSum(self, nums, target)

我当时在想也许是我在程序定义中没有使用self的问题。我仍然遇到同样的问题。尝试twoSum(nums,target),和同样的问题。

2 个答案:

答案 0 :(得分:1)

在函数twoSum中,使用self是合法的,因为它是函数参数的名称。这是令人误解的,因为通常第一个参数名为self意味着您正在编写类的方法,而实际上不是。但这是合法


但是在顶层,没有任何名为self的东西,所以当您这样做时:

twoSum(self, nums, target)

...您得到NameError

目前尚不清楚您想在这里发生什么。您在任何地方定义的唯一内容就是那些numstarget变量以及twoSum函数。似乎没有合适的第一个参数传递给twoSum的地方没有值。


实际上,函数中的self似乎没有任何用处。

您指的是名为xelf.numsself.target的事物,这意味着您期望某个对象具有名为numstarget的属性,但尚未定义任何对象具有此类属性的类(当然,没有内置函数可以做)。

与此同时,您拥有名为numstarget的完美参数,这些参数几乎肯定是您实际上要在此处使用的参数。


也:

  

我当时在想,也许是我在程序定义中没有使用self。

不,这不是去;在Python中,拥有从未使用过的变量,参数等是完全合法的。通常这是一个坏主意,短毛猫可能会对此发出警告,但不会引起错误。

更重要的是,您的问题与之完全相反:不是您定义了self并且没有使用它,而是您没有定义了self并试图使用它

  

尝试twoSum(nums,target),并且遇到同样的问题。

不,您遇到了一个不同问题。阅读错误消息并理解它们的含义很重要。

当Python说NameError: name 'self' is not defined时,它告诉您如何解决此问题。您需要在某个地方定义self,或者不必尝试使用self。没有自动解决此问题的方法-可能是您打错了打字并定义了slef而不是self;也许您打算调用变量self但将其命名为this;在这种情况下,也许会有更深的困惑,而您甚至根本没有要使用的变量。但是最终的问题始终是您试图使用从未定义的内容。

当Python说TypeError: 'twoSum(num, targets)' missing 1 required positional argument: 'target'时,它还会 告诉您如何解决该问题。您尝试使用需要三个参数的函数,但只给了两个参数。再次,没有自动修复-您可能忘记了一个参数,或者您可能在函数定义中包含了不应包含的额外参数,或者您可能忘记了其中一个参数的默认值,或者您可能调用了错误的函数等。但是最终的问题始终是您传递了错误数量的参数。


因此,最有可能修复程序的方法:

  • self定义中删除twoSum参数。
  • self.numsself.target替换函数体内的每个numstarget
  • 从函数调用中删除self参数。

答案 1 :(得分:0)

您使用的是一个简单的函数,而不是对象方法。没有self可供您传递。(self通常保存该方法所属的对象)

您可能还想使用参数sorted(nums)而不是sorted(self.nums)