jeśli piszęróżnica normalny cytat i backquote w Pythonie
a=eval('[[0]*2]*2')
a[0][0]=1
a
staną [[1,0],[1,0]]
Jeśli piszę
a=eval(`[[0]*2]*2`)
a[0][0]=1
a
staną [[1,0],[0,0]]
Czy ktoś może mi powiedzieć czemu?
jeśli piszęróżnica normalny cytat i backquote w Pythonie
a=eval('[[0]*2]*2')
a[0][0]=1
a
staną [[1,0],[1,0]]
Jeśli piszę
a=eval(`[[0]*2]*2`)
a[0][0]=1
a
staną [[1,0],[0,0]]
Czy ktoś może mi powiedzieć czemu?
>>> '[[0]*2]*2'
'[[0]*2]*2'
>>> `[[0]*2]*2`
'[[0, 0], [0, 0]]'
Pierwszy jest tekstem, drugi ocenia bezpośrednio do struktury danych oraz zwraca jej reprezentacji tekstowej '[[0, 0], [0, 0]]'
.
Problem z [[0]*2]*2
polega na tym, że wartość ta jest porównywana z listą odniesień do tego samego obiektu. Dlatego otrzymujesz [[1,0],[1,0]]
, a nie [[1,0],[0,0]]
.
eval('[[0]*2]*2')
Spowoduje to utworzenie wyniku oceny kodu Pythona [[0]*2]*2
. Mnożenie listy tworzy listę z kilkoma odniesieniami do oryginalnych obiektów. Wynikowa lista to [x, x]
, gdzie każdy x
jest listą, która wygląda jak [0, 0]
. Modyfikowanie jednej z podlist zmienia oba, ponieważ są one tym samym obiektem.
eval(`[[0]*2]*2`)
Stwarza powyżej (przez wewnętrzną [[0]*2]*2
), a następnie tworzy swój ciąg znaków (ze względu na backticks), który jest [[0, 0], [0, 0]]
, a następnie tworzy się wynik oceny że Pythonie. Tym razem dwie podlisty są osobnymi listami, które wyglądają jak [0, 0]
, ale są osobnymi obiektami. Modyfikowanie jednej z nich nie ma wpływu na drugą, ponieważ nie są one tym samym obiektem.
BTW, przy użyciu ``
od wielu lat jest odradzane. Ty nie można w rzeczywistości cytować rzeczy z ``
. Służy do tworzenia reprezentacji łańcuchowej niektórych obiektów Pythona.
jest błędem składni.
Warto zauważyć, że ta składnia została wyłączona z Pythona 3. Zamiast tego użyj 'repr()'. –
To przytłaczające wspomnienie, że "cytaty" nie są w ogóle cytowane w Pythonie - są one odpowiednikiem wezwania do "repr" - ale to, co jest w środku, to "kod live", który jest wykonywany. Tak, to jest dziwne i zostało usunięte w nowszej wersji. Należy unikać cytatów. – jsbueno