Hoe een verwijzing naar een variabele in Python te maken?

in de code:

y = 7
x = y
x = 8

Nu, ywordt 7 en x is 8. Maar eigenlijk ben ik om yte wijzigen. Kan ik de referentie van ytoewijzen en dat doen?

Bijvoorbeeld, in C++ kan hetzelfde worden bereikt als:

int y = 8;
int &x = y;
x = 9;

Nu, zowel y& AMP; xis 9


Antwoord 1, Autoriteit 100%

Nee, dat kan niet. Als ander antwoordpunt verwijdert u (AB?) Gebruik van aliasing van mutable objecten om een ​​soortgelijk effect te bereiken. Dat is echter niet hetzelfde als C++ -referenties, en ik wil uitleggen wat er ook gebeurt om eventuele misvattingen te voorkomen.

U ziet, in C++ (en andere talen), een variabele (en objectvelden en vermeldingen in collecties, enz.) is een opslaglocatie en u schrijft een waarde (bijvoorbeeld een geheel getal, een object of een aanwijzer) op die locatie. In dit model zijn referenties een alias voor een opslaglocatie (van welke aard dan ook) – wanneer u een niet-referentievariabele toewijst, kopieert u een waarde (zelfs als het slechts een aanwijzer is, is het nog steeds een waarde) naar de opslaglocatie; Wanneer u aan een referentie toewijst, kopieert u ergens anders naar een opslaglocatie. Merk op dat u geen referentie zelf kunt wijzigen – zodra het is gebonden (en het moet zodra u er een maakt) alle opdrachten aan IT wijzigen niet de referentie, maar waarnaar wordt verwezen.

in Python (en andere talen), een variabele (en objectvelden en vermeldingen in collecties, enz.) is een rechtvaardige naam. Waarden zijn ergens ergens anders (bijvoorbeeld bestrooid over de hoop), en een variabele verwijst (niet in de zin van C++ -referenties, meer als een wijzer minus de aanwijzer rekenkunde) tot een waarde. Meerdere namen kunnen verwijzen naar dezelfde waarde (wat over het algemeen een goede zaak is). Python (en andere talen) noemt alles wat nodig is om te verwijzen naar een waarde een referentie, ondanks dat het behoorlijk niet gerelateerd is aan dingen zoals C++ referenties en pass-by-reference. Toewijzen aan een variabele (of objectveld, of …) maakt het eenvoudigweg naar een andere waarde. Het hele model van opslaglocaties is niet van toepassing op Python, de programmeur behandelt nooit opslaglocaties voor waarden. Alles wat hij winkelt en schudt, zijn python-referenties, en dat zijn geen waarden in Python, dus ze kunnen geen doelwit zijn van andere Python-referenties.

Dit alles is onafhankelijk van de waarde van de waarde – het is bijvoorbeeld hetzelfde voor inten en lijsten. U kunt geen variabele nemen die naar het object verwijst en het object overschrijdt waarin het wijst. U kunt het object alleen laten zien om delen van zich te wijzigen – Zeggen, verander enige referentie die het bevat.

Is dit een meer beperkend model? Misschien, maar het is meestal het grootste deel van de tijd. En wanneer het niet is, kun je er omheen werken, met een aangepaste klasse zoals die hieronder wordt gegeven, of (equivalent, maar minder voor de hand liggend) een verzameling met één element.

class Reference:
    def __init__(self, val):
        self._value = val # just refers to val, no copy
    def get(self):
        return self._value
    def set(self, val):
        self._value = val

Dat sta je nog steeds niet toe om een ​​”regelmatig” variabele of objectveld te alias, maar je kunt meerdere variabelen die verwijzen naar dezelfde ReferenceObject (Idem voor het alternatief Mutable-Singleton-Collection ). Je hoeft alleen maar voorzichtig te zijn om altijd .get()/ .set()(of [0]).


Antwoord 2, Autoriteit 26%

Nee, Python heeft deze functie niet.

Als u een lijst (of een ander mutable object) had, zou u kunnen doen wat u wilt door het object te monteren dat zowel X als Y gebonden zijn aan:

>>> x = [7]
>>> y = x
>>> y[0] = 8
>>> print x
[8]

Zie het online werken: ideone


Antwoord 3, Autoriteit 11%

U kunt ook een zelfgemaakte container gebruiken.

class Value(object):
    def __init__(self, value): self.value = value
y = Value(7)
x = y
x.value = 8
print y.value

ideone


Antwoord 4, Autoriteit 8%

U moet hiervoor een mutable-object gebruiken.

In Python x& AMP; yzijn alleen verwijzingen naar objecten
Dus y = 7betekent y wijst op het object 7.
x=ybetekent xte verwijst naar 7, maar zoals 7is onveranderlijk, dus het veranderen van de waarde van x eenvoudigweg Wijzigt het object 7en ynog steeds wijzen naar 7.

>>> y = [7]
>>> x = y
>>> x[0] = 8 # here you're changing [7] not x or y, x & y are just references to [7]
>>> y
[8]

Other episodes