2013-07-10 19 views
65

Stworzyłem tę funkcję w Pythonie 2.7 z ipython:Przypisywanie wartości do pojedynczego podkreślenia _ w Python/ipython tłumacza

def _(v): 
    return v 

później jeśli zadzwonię _(somevalue), mam _ = somevalue.

in[3]: _(3) 
out[3]: 3 
in[4]: print _ 
out[4]: 3 

Funkcja zniknęła! Jeśli zadzwonię pod numer _(4), otrzymam:

TypeError: 'int' object is not callable` 

Dlaczego? Co jest nie tak z tą funkcją?

+0

Możliwy duplikat [Mercurial/Python - co robi ta funkcja podkreślenia?] (Http://stackoverflow.com/questions/3077227/mercurial-python-what-does-the-underscore-function-do) – dimo414

+10

@ dimo414: Nie, to nie jest * duplikat tego pytania. Dotykam tego użycia funkcji podkreślenia w mojej odpowiedzi, ale to ** nie **, o co pyta OP. Chodzi o to, dlaczego interaktywny interpreter Pythona przypisał coś innego do '_'. –

+1

Masz rację, zdałem sobie z tego sprawę po opublikowaniu możliwego duplikatu. Ponieważ nie możemy [odwołać głosowania na zamknięcie] (http://meta.stackexchange.com/questions/915/can-we-have-the-ability-to-rescind-a-close-vote-before-it -close) Doszedłem do wniosku, że zostawienie referencji było bardziej pouczające (ludzie na pewno mogliby wylądować na tej stronie, szukając odpowiedzi na połączone pytanie), niż usunąć komentarz. – dimo414

Odpowiedz

101

Interpreter języka Python przypisuje ostatnią wartość wyrażenia do _.

Takie zachowanie jest ograniczona tylko do REPL interpreter, i ma na celu pomóc w interaktywnych sesjach Kodowanie:

>>> import math 
>>> math.pow(3.0, 5) 
243.0 
>>> result = _ 
>>> result 
243.0 

standardowy interpreter Pythona idzie do jakiejś długości nie deptać wartości zdefiniowanych przez użytkownika mimo; jeśli sami przypisaliście coś w innym przypadku do _, interpreter nie zastąpi tego (technicznie rzecz biorąc, _ variable is a __builtin__ attribute, twoje własne zadania to "normalne" globale). Nie używasz jednak standardowego interpretera Pythona; używasz IPython, i że tłumacz nie jest tak ostrożny.

ipython documents this behaviour explicitly:

Poniższy zawsze istnieją zmienne globalne (więc nie nadpisać je!):

  • [_] (jedno podkreślenie): przechowuje poprzednią wyjściowych, jak Pythona domyślnego tłumacza .

[...]

Poza interpretera Pythona, _ jest umownie jako nazwa funkcji tekstu tłumaczyć (patrz gettext module; narzędzia zewnętrzne szukać tej funkcji do wyciągać struny do tłumaczenia).

W pętlach, używając _ jako celu przypisania, czytelnicy twojego kodu będą ignorować tę wartość; na przykład [random.random() for _ in range(5)], aby wygenerować listę 5 losowych wartości zmiennoprzecinkowych.

+0

co to jest interaktywna sesja kodowania? jak coś typu instruktażowego? – Stephan

+5

@Stephan: Otwieranie interpretera python bez skryptu, aby wypróbować rzeczy w odpowiedzi na monit REPL. Interpreter kompiluje instrukcje i natychmiast je wykonuje, dzięki czemu łatwo wypróbować coś szybko. –

+1

@MartijnPieters Myślę, że problem jest związany z powłoką 'IPython' tylko dlatego, że wynik jest inny w normalnej powłoce Pythona. –

28

_ to specjalna zmienna w tłumaczu, zawsze przypisana do wyniku poprzedniego wyrażenia. Więc nie używaj tego w ten sposób.

BTW problem wydaje się być związany z ipython powłoki, ponieważ Twój kod działa poprawnie w normalnym Pythona powłoki:

w normalnym Pythona skorupy podczas przypisywania coś do zmiennej _ następnie będzie ona nadal przypisany do tego obiektu tylko i traci to szczególne zachowanie.


Pythona powłoki:

>>> 2*2 
4 
>>> _   #works as expected 
4 
>>> _ = 2  #after assignment, it's magic functionality is gone 
>>> _*5  
10 
>>> _ 
2 

ipython powłoki:

W ipython _ zachowuje się inaczej pyton niż powłoki na _; nawet jeśli przypiszesz ją do pewnej zmiennej, to również zostanie ona zaktualizowana, gdy tylko wykonasz jakieś obliczenia.

In [1]: 2*2 
Out[1]: 4 

In [2]: _ 
Out[2]: 4 

In [3]: _ = 10 

In [4]: _*10 
Out[4]: 100 

In [5]: _ 
Out[5]: 100 

Od ipython za docs:

Poniższy zawsze istnieją zmienne globalne (więc nie nadpisać je!):

_: (pojedynczy znak podkreślenia): sklepy poprzednie wyjście, takie jak domyślny interpreter Pythona . ..

Od pytona docs:

specjalny identyfikator _ jest stosowany w interaktywnym tłumacza zapisać wynik ostatniej oceny; jest przechowywany w module __builtin__. Gdy nie jest w trybie interaktywnym, _ nie ma specjalnego znaczenia i nie jest zdefiniowany.

Uwaga: Nazwa _ jest często używana w połączeniu z internacjonalizacją; Więcej informacji na temat tej konwencji można znaleźć w dokumentacji modułu gettext .

+0

Chociaż nie mam zainstalowanego IPythona, mogę potwierdzić, że tak działa normalna (oficjalna wersja CPython?) Powłoka interaktywna (w wersji 2.7.2). – 2rs2ts

-2

Jeśli utworzysz zmienną przypisaną do "_", zostanie ona zamaskowana/zamaskuje zmienną systemową _.

+2

Jaką zmienną systemową może być '_'? –

Powiązane problemy