Python是与第一类功能的面向对象的语言。它不像C那样处理指针。列表条目本身不是对象,因此您需要同时持有一个项索引和一个对容器的引用,以执行您描述的那种插槽处理。有这样做的软件包,例如buffers,memory views或numpy ndarrays,但它需要一个间接层,因为foo = something
表单的分配将绑定名称foo,而不是修改foo用于引用的内容。
这里就是这样一个间接类的一个实例:
class Indirect(object):
def __init__(self, container, item):
self.container = container
self.item = item
@property
def value(self):
return self.container[self.item]
@value.setter
def value(self, value):
self.container[self.item] = value
l = [1,2,3]
ref = Indirect(l, 1)
ref.value = 5
print(l)
第一类功能支持意味着您也可以动态创建一个功能您需要的具体任务:
l = [1,2,3]
def callwith5(func): # doesn't know what func does
return func(5)
setanitem = lambda i: l[1]=i # creates a new function
callwith5(setanitem)
print(l)
表达这种差异的另一种方式是Python在C术语中并不真正拥有lvalue
;我们只是有一个赋值语句翻译成不同的调用几个语法扩展:
a = 1 # if a is global: setitem(globals(), 'a', 1)
a = 1 # otherwise: setitem(locals(), 'a', 1)
foo.a = 1 # setattr(foo, 'a', 1) => foo.__setattr__('a', 1)
l[1] = 5 # setitem(l, 1, 5) => l.__setitem__(1, 5)
他们中许多人进行了优化,使得没有setitem,SETATTR等的查询,而这些又将有一组规则引用到具体的方法如__setitem__
和__setattr__
,但最终规则是所有东西都是通过某个对象访问的,其根是模块字典。
不,您所描述的行为是不可能在Python。 – CoryKramer 2014-11-14 13:11:45
好的。对于两个指向相同值的列表,是否没有其他possility?但是一个列表只是另一个列表的一个子集。 – char0n 2014-11-14 13:17:39
只有列表中的值是可变的。 – jonrsharpe 2014-11-14 13:19:24