Моделирование указателей в Python

Я помню закрытия JavaScript, когда вижу это .. Вот как я это делаю ..

        function Increment() {
            var num = 0; // Here num is a private static variable
            return function () {
                return ++num;
            }
        }

        var inc = new Increment();
        console.log(inc());//Prints 1
        console.log(inc());//Prints 2
        console.log(inc());//Prints 3
53
задан chollida 26 August 2009 в 10:17
поделиться

7 ответов

Это может должно выполняться явно.

class ref:
    def __init__(self, obj): self.obj = obj
    def get(self):    return self.obj
    def set(self, obj):      self.obj = obj

a = ref([1, 2])
b = a
print a.get()  # => [1, 2]
print b.get()  # => [1, 2]

b.set(2)
print a.get()  # => 2
print b.get()  # => 2
79
ответ дан 7 November 2019 в 08:28
поделиться

Вы можете прочитать Семантику имен переменных Python с точки зрения C ++ . Итог: Все переменные являются ссылками .

Более конкретно, мыслить не в терминах переменных, а в терминах объектов, которые можно назвать .

]
20
ответ дан 7 November 2019 в 08:28
поделиться

Как здесь уже говорили, все переменные Python по сути являются указателями.

Ключом к пониманию этого с точки зрения C является использование неизвестного многими функцией id (). Он сообщает вам, на какой адрес указывает переменная.

>>> a = [1,2]
>>> id(a)
28354600

>>> b = a
>>> id(a)
28354600

>>> id(b)
28354600
4
ответ дан 7 November 2019 в 08:28
поделиться

Все в Python уже является указателями, но в Python это называется «ссылками». Это перевод вашего кода на Python:

a = [1,2]  // a has an array 
b = a     // b points to a
a = 2      // store 2 in a.
print(a)   // outputs 2
print(b)  // outputs [1,2]

«Разыменование» не имеет смысла, поскольку это все ссылки. Больше нет ничего, так что не на что разыменовать.

4
ответ дан 7 November 2019 в 08:28
поделиться

Это глупо, но мысль ...

# Change operations like:
b = &a

# To:
b = "a"

# And change operations like:
*b = 2

# To:
locals()[b] = 2


>>> a = [1,2]
>>> b = "a"
>>> locals()[b] = 2
>>> print(a)
2
>>> print(locals()[b])
2

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

1
ответ дан 7 November 2019 в 08:28
поделиться

Отрицательный, без указателей. Вы не должны нуждаться в них с учетом того, как разработан язык. Однако до меня дошел неприятный слух, что для их использования можно использовать модуль: ctypes . Я не пользовался им, но мне он не нравится.

-2
ответ дан 7 November 2019 в 08:28
поделиться

Если вы компилируете C-подобный язык, скажем:

func()
{
    var a = 1;
    var *b = &a;
    *b = 2;
    assert(a == 2);
}

в Python, тогда все слова «все в Python являются справочными» - неправильное употребление.

Это правда, что все в Python является ссылкой, но тот факт, что многие основные типы (целые числа, строки) неизменяемы, во многих случаях эффективно отменяет это. Не существует прямого способа реализовать описанное выше в Python.

Теперь вы можете сделать это косвенно: для любого неизменяемого типа оберните его в изменяемый тип. Решение Ephemient работает, но я часто просто делаю это:

a = [1]
b = a
b[0] = 2
assert a[0] == 2

(Я делал это, чтобы несколько раз обойти недостаток "нелокальности" Python в 2.x.)

Это подразумевает гораздо больше накладных расходов: каждый неизменяемый тип (или каждый тип, если вы не пытаетесь различать) внезапно создает список (или другой объект-контейнер), так что вы ' re значительно увеличивает накладные расходы на переменные. По отдельности это не так много, но при применении ко всей кодовой базе это будет в сумме.

Вы можете уменьшить это, обернув только неизменяемые типы, но тогда вам нужно будет отслеживать, какие переменные в выводе обертываются а которые нет, поэтому вы можете получить доступ к значению с помощью «a» или «a [0]» соответственно. Возможно, это станет волосатым.

Что касается того, хорошая это идея или нет - это зависит от того, почему вы это делаете. Если вы просто хотите, чтобы что-то запускало виртуальную машину, я бы отказался. Если вы хотите иметь возможность вызывать свой существующий язык из Python, я бы предложил взять существующую виртуальную машину и создать для нее привязки Python, чтобы вы могли обращаться к ней и вызывать ее из Python.

но это будет складываться при применении ко всей кодовой базе.

Вы можете уменьшить это, обернув только неизменяемые типы, но тогда вам нужно будет отслеживать, какие переменные в выводе упакованы, а какие нет, поэтому вы можете получить доступ к значению с помощью «a» или «a [0]» соответственно. Вероятно, это станет волосатым.

Что касается того, хорошая это идея или нет - это зависит от того, почему вы это делаете. Если вы просто хотите, чтобы что-то запускало виртуальную машину, я бы отказался. Если вы хотите иметь возможность вызывать свой существующий язык из Python, я бы предложил взять существующую виртуальную машину и создать для нее привязки Python, чтобы вы могли обращаться к ней и вызывать ее из Python.

но это будет складываться при применении ко всей кодовой базе.

Вы можете уменьшить это, обернув только неизменяемые типы, но тогда вам нужно будет отслеживать, какие переменные в выводе упакованы, а какие нет, поэтому вы можете получить доступ к значению с помощью «a» или «a [0]» соответственно. Вероятно, это станет волосатым.

Что касается того, хорошая это идея или нет - это зависит от того, почему вы это делаете. Если вам просто нужно что-то для запуска виртуальной машины, я бы отказался. Если вы хотите иметь возможность вызывать существующий язык из Python, я бы предложил взять существующую виртуальную машину и создать для нее привязки Python, чтобы вы могли обращаться к ней и вызывать ее из Python.

Мне нужно будет отслеживать, какие переменные в выводе упакованы, а какие нет, поэтому вы можете получить доступ к значению с помощью «a» или «a [0]» соответственно. Возможно, это станет волосатым.

Что касается того, хорошая это идея или нет - это зависит от того, почему вы это делаете. Если вам просто нужно что-то для запуска виртуальной машины, я бы отказался. Если вы хотите иметь возможность вызывать свой существующий язык из Python, я бы предложил взять существующую виртуальную машину и создать для нее привязки Python, чтобы вы могли обращаться к ней и вызывать ее из Python.

Мне нужно будет отслеживать, какие переменные в выводе упакованы, а какие нет, поэтому вы можете получить доступ к значению с помощью «a» или «a [0]» соответственно. Вероятно, это станет волосатым.

Что касается того, хорошая это идея или нет - это зависит от того, почему вы это делаете. Если вы просто хотите, чтобы что-то запускало виртуальную машину, я бы отказался. Если вы хотите иметь возможность вызывать существующий язык из Python, я бы предложил взять существующую виртуальную машину и создать для нее привязки Python, чтобы вы могли обращаться к ней и вызывать ее из Python.

Я обычно говорю «нет». Если вы хотите иметь возможность вызывать свой существующий язык из Python, я бы предложил взять существующую виртуальную машину и создать для нее привязки Python, чтобы вы могли обращаться к ней и вызывать ее из Python.

Я обычно говорю «нет». Если вы хотите иметь возможность вызывать свой существующий язык из Python, я бы предложил взять существующую виртуальную машину и создать для нее привязки Python, чтобы вы могли обращаться к ней и вызывать ее из Python.

14
ответ дан 7 November 2019 в 08:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: