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

Gyu*_*rli 4 python self

我有一个类(dicts 列表),我希望它自己排序:

class Table(list):
…
  def sort (self, in_col_name):
    self = Table(sorted(self, key=lambda x: x[in_col_name]))
Run Code Online (Sandbox Code Playgroud)

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

new_table = Table(sorted(old_table, key=lambda x: x['col_name'])
Run Code Online (Sandbox Code Playgroud)

是不是可以操纵对象本身?拥有以下内容更有意义:

class Table(list):
  pass
Run Code Online (Sandbox Code Playgroud)

比:

class Table(object):
  l = []
  …
  def sort (self, in_col_name):
    self.l = sorted(self.l, key=lambda x: x[in_col_name])
Run Code Online (Sandbox Code Playgroud)

我认为,这是有效的.一般来说,Python中没有任何方法可以改变对象(不仅仅是实例变量)?

Tho*_*zco 16

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

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

def fn(a):
   a = 2
a = 1
fn(a)
# a is still equal to 1
Run Code Online (Sandbox Code Playgroud)

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


只需使用list.sort以下方式排序:

def sort(self, in_col_name):
    super(Table, self).sort(key=lambda x: x[in_col_name])
Run Code Online (Sandbox Code Playgroud)