2017-04-03 109 views
1

我有一个对象列表。一旦创建,列表不会改变 - 但是对象属性的值将会改变。保持列表中对象“指针”的最佳方式是什么?

我需要在任何时候在列表中维护两个“指针”。例如,“这个”,“那个”

我能做到这一点仅仅是保持两个数字指标:

this=3 
that=7 
doSomething(mylist[this]) 
doSomethingElse(mylist[that]) 
this=9 
doSomethingNew(mylist[this]) 

或者,我可以通过引用而不是对象做到这一点? e.g像

this=mylist[3] 
that=mylist[7] 
doSomething(this) 
doSomethingElse(that) 
this=mylist[9] 
doSomethingNew(this) 

将在“此”影响到列表中的对象,而不是它的一个副本,所有的操作即更改将被保留?

+0

依赖于在该列表中的对象。如果它是不可变的,那么你不应该担心,如果它是可变的,你传递的是对象的引用,并且你不能有任何*保证对象状态不变* –

+0

什么样的对象是这些?如果类定义是你的,请将其添加。 –

+0

对象的属性值将随时间而改变。 –

回答

2

“this”的所有操作是否会影响列表中的对象,而不影响列表中的对象,即更改将被保留?

是的。该列表只包含相同对象的引用。

什么是保持列表中的对象的“指针”的最佳方式是什么?

你提到“一旦创建,列表不会改变”,这么多的它是否是更好地维护索引到列表,或者只是对象本身,是这里无关紧要的参数。

那么你对指数做了什么?

  • 如果你只使用的索引,以便访问对象(通过list.__getitem__),那么你可能也只是保持直接的对象的引用。
  • 如果您关心指数的价值,例如列表中这对项之间的距离,或者是否在列表的开始/结束/中间,然后使用整数。

自定义类可能是一个很好的选择,但您必须发布更多的代码并描述用例才能获得可靠的建议。

1

只要你不重新分配对象本身,任何方法都可以工作。这些对象是可变类型吗?

重新分配也取决于你的方法如何工作。

我强烈建议您在发布之前完成您应该完成的研究:编写您想要做的简单版本的代码,尝试每种方法,并查看每个版本是否具有您需要的功能。


如果它们都工作,那么您需要根据软件设计问题来决定:是否易于阅读?它快吗?易于维护吗?他人理解容易吗?

例如,有几次,我选择了一个较慢的算法(例如冒泡排序而不是基于指针的合并排序),因为这个列表永远不会变得足以让时间差异变得很重要,而且冒泡排序是某种东西任何现在或将来,我的团队中的软件负责人都能理解和维护。

1

TL; DR:是的,所有更改为thisthat将显示在列表中。这是因为Python中的变量赋值方式 - (可变)名称是对值的引用。

请参阅本文就如何变量赋值在Python的工作原理:Facts and myths about Python names and values

从文章

有用的片段:“一个Python赋值语句与右侧的值在左侧相关联的符号名在Python中,我们说名称是指值,或者名称是对值的引用......如果您有列表元素引用其他可变值(如子列表),请务必记住列表元素是只是参考价值。“

另一个有用的资源,以了解在Python变量和分配是如何工作的:http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#other-languages-have-variables

相关问题