2012-02-03 10 views

Odpowiedz

14
>>> '[[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]].

+6

Warto zauważyć, że ta składnia została wyłączona z Pythona 3. Zamiast tego użyj 'repr()'. –

+2

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

5
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.

Powiązane problemy