Wskaźniki, referencje

0

Witam mam do zrobienia zadania ze wskaźnikami i referencjami. Czytałem na internecie, że nie ma czegoś takiego w pythonie, nauczyciel układa zadania pod c++
Zad1. Napisz funkcję otrzymującą jako argumenty wskaźniki do dwóch zmiennych typu int, która zamienia ze sobą wartości wskazywanych zmiennych.
Zad2. Napisz funkcję otrzymującą jako argumenty referencje, do dwóch zmiennych typu int która zamienia ze sobą wartości zmiennych do których referencje dostaliśmy w argumentach.
Zad3.Napisz funkcję otrzymującą jako argumenty wskaźniki do dwóch zmiennych typu int, która zwraca jako wartość wskaźnik na zmienną przechowującą mniejszą z liczb wskazanych przez argumenty. Nie wiem jak się za to zabrać może ktoś zrobi przykład żebym mógł go przeanalizować.

1

To nie jest Python, tylko C++, w Pythonie nie ma wskaźników. Zacznij coś robić i Wrzuć, na sieci jest pełno bardzo dobrych materiałów.

1
lion137 napisał(a):

To nie jest Python, tylko C++, w Pythonie nie ma wskaźników.

Odwrotnie, w Pythonie każda zmienna jest wskaźnikiem. :)

0

Ok mam takie coś skoro każda zmienna jest wskaźnikiem, a każde zmienne przekazywane do funkcji jest referencyjna to jak mam zamienić wartość ich w funkcji jeżeli pracujemy na oryginalnych zmiennych ?

x = int(input("Podaj pierwszą zmienną"))
y = int(input("Podaj drugą zmienną"))

def change(x, y):
    x = y
    y = x
    print(x, y)

change(x, y)
1

Chyba pracujemy na kopii, a nie na oryginalnych zmiennych, a to jest zadanie z C++. W Pythonie Możesz zmienić argument funkcji jedynie tak(co nie jest polecane i jest to zupełnie co innego):

def f():
    global x
    global y
    x, y = y, x

x, y = 1, 2
print(x, y) # -> 1, 2

f()
print(x, y) # -> 2, 1

Albo zwracając wartości.
Można też zmieniać pola struktur, poniewaz Python operuje tylko na referencjach - czyli , np., lista składa się z referencji do jej wartości, uff:), a zmieniając referencję zmieniamy to na co ona wskazuje:

def f(xs, a, b):
    xs[0] = a
    xs[1] = b

a_list = [1, 2]
print(a_list) # -> [1, 2]

f(a_list, 2, 1)
print(a_list) # -> [2, 1]

Tak czy inaczej jesteśmy w zupełnie innym świecie:)

0
def show(variable):
    print('---FUNKCJA SHOW---')
    print(f'Przed zmiana: {variable}')
    variable[0] = 'Poznan'
    variable[1] = 'Wroclaw'
    print(f'Po zmianie: {variable}')
    print(f'ID obiektu to: {id(variable)}')
    print('---KONIEC FUNKCJI SHOW---')

cities = ['Krakow', 'Warszawa']

print(f'Przed funkcja show: {cities}')
print(f'ID obiektu to: {id(cities)}')
show(list(cities))
print(f'Po funkcji show: {cities}')

Tutaj jest przykład jak można to zmieniać jednak nie do końca to rozumiem

3

Polecam coś takiego:
http://www.pythontutor.com/visualize.html#mode=edit
-- wszystko zobaczycie, jak się dokładnie dzieje ze zmiennymi w Pythonie. I widać tam jak na dłoni, że w Pythonie wszystkie zmienne są traktowane jak wskaźniki w C++. Nie można więc w ten sposób (jak swap w C++) zamienić zmiennych, bo tam potrzeba referencji...

2

Jest coś takiego w pythonie jak id(zmienna), która w CPython podaje adres pamięci danej zmiennej, w związku z czym można by traktować praktycznie wszystko w pythonie jako wskaźniki. Np, w takim kodzie:

x = 1
print(f"x = {id(x):016X}")
x = x + 1
print(f"x = {id(x):016X}")
y = 1
print(f"y = {id(y):016X}")
print(f"1 = {id(1):016X}")
print(f"2 = {id(2):016X}")

stała 1 jest obiektem niemutowalnym znajdującym się pod konkretnym adresem, i iteracja x o 1 tworzy nowy obiekt (2) i jego adres jest przypisany do zmiennej x.

Btw. jako nowy użytkownik witam wszystkich na forum :)

0

@jvoytech: Z tą jedynie różnicą, że nie możesz jawnie tego adresu przypisać -- co można zrobić w C/C++.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0