为什么分配给自己不起作用,以及如何解决问题?

时间:2013-09-03 19:51:21

标签: python self

我有一个班级(dict的列表),我希望它自行排序:

class Table(list):
…
  def sort (self, in_col_name):
    self = Table(sorted(self, key=lambda x: x[in_col_name]))

但它根本不起作用。为什么?怎么避免呢?除了在外部进行排序外,例如:

new_table = Table(sorted(old_table, key=lambda x: x['col_name'])

是不是可以操纵对象本身?拥有:

更有意义
class Table(list):
  pass

比:

class Table(object):
  l = []
  …
  def sort (self, in_col_name):
    self.l = sorted(self.l, key=lambda x: x[in_col_name])
我认为,这是有效的。 一般来说,Python中没有任何方式,对象能够自行更改(不仅仅是实例变量)?

3 个答案:

答案 0 :(得分:16)

您无法从方法中重新分配给self,并希望它更改对象的外部引用。

self只是传递给你的函数的参数。它是一个名称,指向调用该方法的实例。 “分配给self”等同于:

def fn(a):
   a = 2
a = 1
fn(a)
# a is still equal to 1

分配到self会更改self 名称指向的内容(从一个Table实例到此处的新Table实例)。但就是这样。它只是更改名称(在您的方法范围内),并且不会影响基础对象,也不会影响指向它的其他名称(引用)。


使用list.sort进行排序:

def sort(self, in_col_name):
    super(Table, self).sort(key=lambda x: x[in_col_name])

答案 1 :(得分:2)

Python总是按值传递。这意味着分配参数永远不会对函数外部产生影响。 self只是您为其中一个参数选择的名称。

答案 2 :(得分:0)

我被这个问题所吸引,因为我从来没有想过这个。我查找了list.sort代码,看看它是如何完成的,但apparently it's in C。我想我知道你在哪里;如果没有super方法可以调用怎么办?然后你可以做这样的事情:

class Table(list):
    def pop_n(self, n):
        for _ in range(n):
            self.pop()

>>> a = Table(range(10))
>>> a.pop_n(3)
>>> print a
[0, 1, 2, 3, 4, 5, 6]

您可以调用self的方法,对self进行索引分配,并在其类中(或您implement yourself)执行其他任何操作。