Python-эквивалент указателей - PullRequest
4 голосов
/ 14 января 2010

В питоне все работает по ссылке:

>>> 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

Что бы вы заменили магическим указателем на , чтобы питон выводил то, что я хочу.

Буду признателен за общие решения (не только для приведенного выше словарного примера с независимыми переменными, но и для других коллекций и переменных класса / экземпляра)

Ответы [ 5 ]

4 голосов
/ 14 января 2010

А как насчет изменяемой структуры данных?

>>> 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 голосов
/ 14 января 2010

Стандартное решение - просто использовать список; это самая легкая изменяемая структура.

a = [1]
d = {'a': a}
a[0] = 2
print d['a'][0]
1 голос
/ 14 января 2010

Это потому, что 1 является неизменяемым типом данных в python, то есть вы не можете изменить его значение.

Чтобы он работал как указатель, вам нужен изменяемый тип данных в качестве хранилища, что вы можете сделать самостоятельно с определением класса

class Mutable(object):
    pass

a = Mutable()
a.value = 1

d = {'a':a}
a.value = 3

d['a'].value равняется 3 в этой точке.

Если вы действительно хотите, вы можете перегрузить операторы и т. Д., Чтобы получить ту же семантику, что и для обычных целых чисел, но я бы посоветовал вам вместо этого взглянуть на некоторые шаблоны функционального программирования, чтобы понять, почему неизменные типы хороши. 1009 *

0 голосов
/ 18 мая 2019

немного опоздал на вечеринку, но вот решение, которое работает с любым типом данных с lamda

a = 1
d = {'a': lambda  : a}
print(d['a']()) #output 1
a = 2
print(d['a']()) #output 2
0 голосов
/ 14 января 2010

Если вы работаете в классе, вы можете сделать что-то вроде этого:

class DRefsA(object):
    a = 4

    @property
    def d(self):
        return self.a

    @d.setter
    def d(self, value):
        self.a = value
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...