V rubíne 2.4:
x = ["a"]
y = {}
x[0] = y[x[0]] = y.fetch(x[0], y.length)
puts y #=> {"a"=>0}
V pytóne 3.5:
x = ["a"]
y = {}
x[0] = y[x[0]] = y.get(x[0], len(y))
print(y) #=> {0: 0}
Prečo toto?
ETA:
y[x[0]] = x[0] = y.get(x[0], len(y))
produkuje očakávané správanie (veľa na moju zúfalosť.)
odpovede:
5 pre odpoveď č. 1Ruby a Python sú rôzne jazyky a robia rôzne možnosti. V Pythone sú priradené úlohy vyhlásenie a vyhodnocuje viaceré ciele priradenia zľava doprava, Ruby urobila iné možnosti; úlohy sú výrazov a ako výsledok sa hodnotí v opačnom poradí.
Takže v Ruby sa to stane:
- Ohodnotiť
y.fetch(x[0], y.length)
, produkuje0
(kľúč nie je k dispozícii,y
je prázdny). - Ohodnotiť
y[x[0]] = 0
, taky["a"] = 0
, Toto je výsledok výrazu0
. - Ohodnotiť
x[0] = 0
(0
je výsledkomy[x[0]] = 0
priradenie výrazu).
Všimnite si, že v Ruby, ako priradenie je vyjadrenie, Môže byť vnorená do iných výrazov a výsledok priradenia je hodnota cieľa po priradení.
V Pythone sa to stalo namiesto toho:
- Ohodnotiť
y.get(x[0], len(y))
, produkuje0
(kľúč nie je k dispozícii,y
je prázdny). - Ohodnotiť
x[0] = 0
. - Ohodnotiť
y[x[0]] = 0
, taky[0] = 0
.
Z Pythonu dokumentácia o vyhláseniach o postúpení:
Vyjadrenie priradenia hodnotí výraz(nezabudnite, že to môže byť jediný výraz alebo zoznam oddelených čiarkou, ktorý prináša n-ticu) a priradí jediný výsledný objekt každému cieľovému zoznamu zľava doprava.
Vyhodnocuje sa výraz na pravej strane najprv, a potom sa priradenie k jednotlivým cieľom zľava doprava.
Python vykonal vyhlásenia o úlohách účelovo, pretože rozdiel medzi:
if a = 42:
a
if a == 42:
je tak zatraceně ťažké na mieste, a aj keď úmyselne naozaj bolí čitateľnosť kódu. V Pythone sa počíta čitateľnosť. Veľa.
Všeobecne povedané, naozaj sa chcete vyhnúť priradeniu mien, ktoré sa potom použijú v nasledujúcich úlohách v tom istom výkaze. Neprideľujte x[0]
a potom použite x[0]
znova v rovnakom priradení, že je to len nesmierne mätúce.