/ / Python priradenie quirk w / list index priradiť, dict index priradiť a dict.get - python, ruby, premenné priradenie

Python priradenie quirk w / list index priradiť, dict index priradiť a dict.get - python, ruby, premenné-priradenie

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ď č. 1

Ruby 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), produkuje 0 (kľúč nie je k dispozícii, y je prázdny).
  • Ohodnotiť y[x[0]] = 0, tak y["a"] = 0, Toto je výsledok výrazu 0.
  • Ohodnotiť x[0] = 0 (0 je výsledkom y[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)), produkuje 0 (kľúč nie je k dispozícii, y je prázdny).
  • Ohodnotiť x[0] = 0.
  • Ohodnotiť y[x[0]] = 0, tak y[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.