Я помню закрытия 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
Это может должно выполняться явно.
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
Вы можете прочитать Семантику имен переменных Python с точки зрения C ++ . Итог: Все переменные являются ссылками .
Более конкретно, мыслить не в терминах переменных, а в терминах объектов, которые можно назвать .
]Как здесь уже говорили, все переменные Python по сути являются указателями.
Ключом к пониманию этого с точки зрения C является использование неизвестного многими функцией id (). Он сообщает вам, на какой адрес указывает переменная.
>>> a = [1,2]
>>> id(a)
28354600
>>> b = a
>>> id(a)
28354600
>>> id(b)
28354600
Все в 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]
«Разыменование» не имеет смысла, поскольку это все ссылки. Больше нет ничего, так что не на что разыменовать.
Это глупо, но мысль ...
# 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
Но не было бы арифметики указателей или чего-то подобного, и не было бы никаких указаний, с какими еще проблемами вы можете столкнуться ...
Отрицательный, без указателей. Вы не должны нуждаться в них с учетом того, как разработан язык. Однако до меня дошел неприятный слух, что для их использования можно использовать модуль: ctypes . Я не пользовался им, но мне он не нравится.
Если вы компилируете 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.