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),和同样的问题。
答案 0 :(得分:1)
在函数twoSum
中,使用self
是合法的,因为它是函数参数的名称。这是令人误解的,因为通常第一个参数名为self
意味着您正在编写类的方法,而实际上不是。但这是合法。
但是在顶层,没有任何名为self
的东西,所以当您这样做时:
twoSum(self, nums, target)
...您得到NameError
。
目前尚不清楚您想在这里发生什么。您在任何地方定义的唯一内容就是那些nums
和target
变量以及twoSum
函数。似乎没有合适的第一个参数传递给twoSum
的地方没有值。
实际上,函数中的self
似乎没有任何用处。
您指的是名为xelf.nums
和self.target
的事物,这意味着您期望某个对象具有名为nums
和target
的属性,但尚未定义任何对象具有此类属性的类(当然,没有内置函数可以做)。
与此同时,您拥有名为nums
和target
的完美参数,这些参数几乎肯定是您实际上要在此处使用的参数。
也:
我当时在想,也许是我在程序定义中没有使用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.nums
和self.target
替换函数体内的每个nums
和target
。self
参数。答案 1 :(得分:0)
您使用的是一个简单的函数,而不是对象方法。没有self
可供您传递。(self
通常保存该方法所属的对象)
您可能还想使用参数sorted(nums)
而不是sorted(self.nums)
。