On 2024-08-10 20:09, Patrick Rudin <taxi...@gmx.ch> wrote:
> Der Begriff "Alias" verwirrt mich auch ein wenig. Wenn ich Aliasnamen 
> benutze und mich als Klaus-Bärbel oder auch mal als Matrosentom ausgebe 
> und mir jemand eine blutige Nase verpasst, dann zeigen beide Alias-Namen 
> auf dieselbe Person, die eine blutige Nase hat. Passt nicht so ganz zum 
> Informatik-Konzept.

Aliasing in Programmiersprachen bedeutet einfach, dass zwei Namen (oder
allgemeiner zwei Ausdrücke) das gleiche Ding bezeichnen, was auch immer
dieses Ding sein mag.

Dein Beispiel, in dem Du verschiedene Namen trägst, entspricht genau dem
Konzept von Python:

patrick_rudin = Person()
klaus_bärbel = patrick_rudin
matrosen_tom = patrick_rudin

# Hier haben wir jetzt eine Person mit drei Namen, nicht drei Klones.

matrosen_tom.kriegt_eine_auf_die_nase()

assert patrick_rudin.nase.blutet ()

;-)

Das ist auch insofern gleich, als im richtigen Leben ein Name nicht das
gleiche wie eine Person ist eine Person mehrere Namen haben kann, und
ein Name nicht einen anderen Namen bezeichnen kann, sondern nur eine
Person.

Es gibt natürlich auch Unterschiede, z.B. kann in Python ein Name immer
nur auf genau ein Objekt zeigen, während wir es im richtigen Leben
gewohnt sind, dass Namen nicht eindeutig sind und mehrere Personen
bezeichnen können.

Aber dieses Aliasing war offensichtlich nicht das, was Du gemeint hast.


Du meintest, dass das Ding, das da gealiast wird, der Ausdruck selbst
ist. Nach

    b = t[1]

sollte

    b = 10

exakt die gleichen Auswirkungen haben wie 

    t[1] = 10

Das passiert z.B. in Perl implizit in einer Schleife:

------------------------------------------------------------------------
#!/usr/bin/perl
use v5.30;
use warnings;

my @a = (1, 2, 3);

for my $x (@a) {
    $x = 10;
}
say for @a;
------------------------------------------------------------------------

gibt
10
10
10
aus.

In C++ kann man das explizit mit Referenzen machen:

------------------------------------------------------------------------
#include <iostream>             // 1

int main() {                    // 3
    int a = 3;                  // 4
    int &b = a;                 // 5
    b = 5;                      // 6
    std::cout << a << "\n";     // 7
    return 0;                   // 8
}                               // 9
------------------------------------------------------------------------

Aber C++ unterscheidet sich von Python dadurch, dass Variablen ihre
Werte tatsächlich enthalten (und nicht nur auf sie verweisen). Im
Beispiel oben gibt es 4 Bytes am Stack, die der Compiler als "a"
bezeichnet und die zunächst mit dem Wert 0x00000003 überschrieben werden
(Zeile 4) und später mit dem Wert 0x00000005 (Zeile 6). b wiederum sind
8 Bytes, die mit der Adresse des ersten Bytes von a initialisiert werden
(Zeile 5) und weil der Compiler weiß, dass es eine Referenz ist, wird
bei der Zuweisung in Zeile 6 nicht b selbst (also die Adresse) geändert,
sondern das, worauf b zeigt.

In C müsste man das explizit machen:

------------------------------------------------------------------------
    ...
    int *b = &a;
    *b = 5;
    ...
------------------------------------------------------------------------

Hier ist b also kein Alias von a, sondern der Ausdruck *b (& bestimmt
die Adresse eines Objekts, * dereferenziert einen Pointer).

Die meisten Programmiersprachen, die ich kenne, folgen diesem "Eine
Variable ist ein Speicherbereich, der einen Wert enthält" Modell,
zumindest für einfache Typen. In Java sind Variablen vom Objekt-Typ
immer Referenzen. Wenn man von Java kommt, ist das Python-Modell daher
recht logisch: Da es in Python nur Objekt-Typen gibt (im Gegensatz zu
Java) verhalten sich alle Typen so wie die Objekt-Typen in Java.

        hp
_______________________________________________
python-de Mailingliste -- python-de@python.org
Zur Abmeldung von dieser Mailingliste senden Sie eine Nachricht an 
python-de-le...@python.org
https://mail.python.org/mailman3/lists/python-de.python.org/
Mitgliedsadresse: arch...@mail-archive.com

Reply via email to