Изменение содержимого переменной, переданной функции в Python. Синтаксический сахар для создания ссылки из переменной?Python

Программы на Python
Ответить
Anonymous
 Изменение содержимого переменной, переданной функции в Python. Синтаксический сахар для создания ссылки из переменной?

Сообщение Anonymous »

Можно ли как-нибудь переформатировать

Код: Выделить всё

def alterContents(dictionary,key):
dictionary[key]="foobar"
myVar="hello"
alterContents(globals(),"myVar")
print(myVar)
разрешить изменять содержимое myVar, передавая функции только один аргумент? Что-то вроде:

Код: Выделить всё

def alterContents(variable):
variable="foobar" #psuedo code that would change the contents of the variable fed into it, in a similar manner to how you can set the data at memory address in most programming languages (for example, via "references" in C++).
myVar="hello"
alterContents(myVar)
print(myVar) # would print "foobar"
Или другими словами: я ищу способ создания указателя на любую абстрактную переменную (где я не контролирую, как и где эта переменная создается и хранится (хотя, поскольку Python кажется чтобы хранить все в dict(), я полагаю, можно было бы с некоторой уверенностью предположить, что это так)).
Для моего реального варианта использования также просто возвращение новое значение, позволяющее вызывающему функцию впоследствии присвоить переменную, не будет работать, поскольку мой реальный эквивалент alterContents на самом деле не изменяет содержимое самой переменной, а скорее сохраняет «ссылку/указатель» для использования другими механизмами в более позднее время.
Очевидным решением может быть что-то вроде:

Код: Выделить всё

class Pointer:
def __init__(self,dictionary,varName) -> None:
self.dictionary=dictionary
self.varName=varName
@property
def value(self):
return self.dictionary[self.varName]
@value.setter
def value(self,val):
self.dictionary[self.varName]=val

def alterContents(variable):
variable.value="foobar" #psuedo code that would change the contents of the variable fed into it, in a similar manner to how you can set the data at memory address in most programming languages (for example, via "references" in C++).
myVar="hello"
alterContents(Pointer(globals(),'myVar'))
print(myVar) # would print "foobar"
Но на самом деле я просто делаю то же самое, что и в моем первом примере, и статические анализаторы языка (например, PyLance) не смогут следовать этой ссылке (что означает, что такие операции, как переименование переменных, будут не работает для строки, которую я ввожу во второй параметр Pointer.__init__).
Будем очень благодарны за любые мысли/идеи/ссылки/информацию.

Подробнее здесь: https://stackoverflow.com/questions/791 ... ntactic-su
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»