2016-06-30 1 views
-1

私はリストバズを取る関数fooを持っており、FOOに、私はそうのようなバズをクリアしたかったと言う:Pythonのポインタあいまい

baz = [] 
foo(baz) 

foo(baz): 
    baz = [] 

さて、このコードは、私はそれをしたいと思う何をしません。これは、bazという新しいローカルリストを作成するためです。私はこれを行うための他の方法があることを知っているが、私はPythonの文

baz = [] 

は、新しい空のチャンクで外側のスコープのバズ変数を指すようにはPythonを伝えると解釈される可能性があり、このようなあいまいさを解決する知っていただきたいと思います空のメモリチャンクを指す新しいポインタを作成することができます。

EDIT

私はリストをクリアする方法を求めていないですのでご注意ください。私はPythonインタープリタの動作について尋ねています。 downvotingの前に質問をはっきりと読んでください。

+1

をさて私は、リストをクリアする方法を知っています。私はちょうどdel foo [:]を使いましたPyhton通訳がこのような状況をどのように見ているのか疑問に思っていました。 –

+0

割り当ては、 'global'キーワードを使用しない限り、常にローカル変数として解釈されます。しかし、パラメータ 'baz'を指定したので、グローバル' baz'を参照することはできません。 Pythonの変数はC、Javaなどの変数に似ていません。この偉大な話を見てください:https://www.youtube.com/watch?v=_AEJHKGk9ns –

+0

コードを実行することでインタープリタの動作を見ることができます。何についてあなたは実際に尋ねていますか?可変スコープですか? – TigerhawkT3

答えて

2

globalまたはnonlocalキーワードで明示的に指定すると、Pythonは変数スコープの変数に代入することのみを扱います。globalは、グローバル変数のためである、とnonlocalは閉鎖変数用のPython 3専用のキーワードです:

x = 1 
def change_x(): 
    global x 
    x = 2 
def dont_change_x(): 
    # no global 
    x = 3 

change_x() 
print(x) # prints 2 

dont_change_x() 
print(x) # still prints 2 

そうでない場合、それは常にローカル変数への代入として割り当てを解釈します。

1

あなたのリスト内の項目をクリアする場合は、あなただけのをスライスことにより、古いものを消去し、新しいリストに現在の名前を再割り当てする必要はありません。

foo(baz): 
    baz[:] = [] # clears out list baz 

baz[:]が道であります

あなたが割り当てトンで同じを使用する場合:あなたのリスト内のすべての項目をインデックス化し、更新彼らに

を新しい値を割り当てますあなたは古いリストをリファクタリングするをスライスを使用する場合を除き

>>> baz = [] 
>>> id(baz) 
14832064 
>>> baz = [] 
>>> id(baz) 
14834304 

、名前bazは、もはやoldリストを参照できなくなります:OA新しいリストは、インタプリタは単に名前が新しいlist対象にすることを再割り当て。

+0

それは質問者が求めていることではありません。 – user2357112

0

使用スライシング:

>>> def foo(baz): 
...  baz[:] = [] 
... 
>>> baz = [1, 2] 
>>> foo(baz) 
>>> baz 
[] 

my_list[:]同じmy_listオブジェクトを参照、代入文の右辺の内容でmy_list内のすべての要素を置き換えるためのPythonを伝えます。

+0

それは質問者が求めていることではありません。 – user2357112

+0

@ user2357112 - 私はそうだと思うので、質問は明らかに私が思ったよりもはっきりしていません。私は説明を待つ。 – TigerhawkT3

+0

質問者は質問のコメントに明確化を提供しました。 – user2357112

-1

リストをクリアしたい場合は、代わりに新しいリストを作成する.clear()を使用します。

def foo(baz): 
    baz.clear() 

サイドノート:globalキーワードを使用するようにfoo()することができますで、外側bazにアクセスします。しかし、PythonはSyntaxErrorを投げて引数の名前を変更する必要があるので、あいまいさはありません。

def foo(baz2): 
    global baz 
    baz = [] 

globalの使用はお勧めできません。

+0

これは必須ではありません。 OPは既に引数としてリストへの参照を渡しています。 – TigerhawkT3

+2

さらに、bazはグローバルおよびパラメータにすることはできません。 –

+1

他のオプションが悪化しない限り、グローバルは使用しないでください。彼らはそうではありません、この場合 – GingerPlusPlus

1

passing parameters by assignmentのpythonの方法を理解するためにこのポストを見てください。

何が起こっているのは、変数bazを別のリストに再定義しているため、外側のbazへの参照がもうないということです。リスト内の要素を直接操作する必要があります。例えば

あなたがBAZする要素を追加している場合、外側のリストには、変更を取得します:

def foo(baz): 
    baz.append('baz') 

しかし、これを行うことにより:

def foo(baz): 
    baz = [] 

あなたは、新しいリストを割り当てますbazとあなたの外側のbazへの参照は今壊れています。あなたのケースでは

、あなたがリストをクリアするには2つのオプションがあります:

del baz[:] 
baz[:] = [] 
関連する問題