【问题标题】:Python equivalent of pointersPython 等价于指针
【发布时间】:2010-01-14 15:18:49
【问题描述】:

在 python 中,一切都通过引用起作用:

>>> a = 1
>>> d = {'a':a}
>>> d['a']
1
>>> a = 2
>>> d['a']
1

我想要这样的东西

>>> a = 1
>>> d = {'a':magical pointer to a}
>>> d['a']
1
>>> a = 2
>>> d['a']
2

你会用什么来代替 magical pointer to a 以便 python 输出我想要的。

我会很感激通用解决方案(不仅适用于上述带有自变量的字典示例,而且适用于其他集合和类/实例变量)

【问题讨论】:

  • 我们称之为“别名”。 a 有两个名称:ad['a']。这通常被认为是一件坏事,因为不清楚为什么会发生变化。你为什么要这样做?故意创建晦涩的代码有什么意义?
  • @S.Lott,这可能是您有多个大型数据结构并且它们指向其他大型数据结构数据并且您需要在线程中修改它们并在 UI 中显示的情况.

标签: python pointers reference


【解决方案1】:

可变数据结构呢?

>>> a = mutable_structure(1)
>>> d = {'a':a}
>>> d['a']
1
>>> a.setValue(2)
>>> d['a']
2

一个实现可能看起来像

class mutable_structure:
  def __init__(self, val):
    self.val = val

  def __repr__(self):
    return self.val

【讨论】:

    【解决方案2】:

    标准的解决方案是只使用一个列表;这是最简单的可变结构。

    a = [1]
    d = {'a': a}
    a[0] = 2
    print d['a'][0]
    

    【讨论】:

    • 不是一个优雅的解决方案,但比其他解决方案更好且简单。奇怪的是,在我看来,这不仅仅是语言的一部分。对于这种情况,我可以用 C 语言编写比 Python 更容易阅读的答案。
    【解决方案3】:

    这是因为 1 在 python 中是不可变的数据类型,即你不能改变它的值。

    为了让它像指针一样工作,你需要一个可变数据类型作为存储,你可以自己定义一个类

    class Mutable(object):
        pass
    
    a = Mutable()
    a.value = 1
    
    d = {'a':a}
    a.value = 3
    

    d['a'].value 此时等于 3。

    如果你真的想要,你可以重载运算符等,这样你就可以获得与普通整数相同的语义,但我建议你看看一些函数式编程模式,看看为什么不可变类型很好。

    【讨论】:

      【解决方案4】:

      如果你在课堂上工作,你可以这样做:

      class DRefsA(object):
          a = 4
      
          @property
          def d(self):
              return self.a
      
          @d.setter
          def d(self, value):
              self.a = value
      

      【讨论】:

        【解决方案5】:

        聚会有点晚了,但这里有一个适用于 lamda 的任何数据类型的解决方案

        a = 1
        d = {'a': lambda  : a}
        print(d['a']()) #output 1
        a = 2
        print(d['a']()) #output 2
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-05-24
          • 1970-01-01
          • 2015-09-06
          • 2016-07-24
          • 2022-01-23
          • 2013-08-10
          • 1970-01-01
          相关资源
          最近更新 更多