web-dev-qa-db-ja.com

Pythonグローバル/ローカル変数

このコードが機能する理由:

var = 0

def func(num):
    print num
    var = 1
    if num != 0:
        func(num-1)

func(10)

しかし、これは「割り当て前に参照されるローカル変数 'var'」エラーを出します:

var = 0

def func(num):
    print num
    var = var
    if num != 0:
        func(num-1)

func(10)
10
JJ Beck

最初のコードではローカル変数varを作成してその値を使用しているのに対し、2番目のコードではローカル変数varを定義せずに使用しているためです。

したがって、2番目の関数を機能させたい場合は、次のように宣言する必要があります:-

global var

varを使用する前に関数で。

def func(num):
    print num
    var = 1  <--  # You create a local variable
    if num != 0:
        func(num-1)

一方、このコードでは:

def func(num):
    print num
    var = var <--- # You are using the local variable on RHS without defining it
    if num != 0:
        func(num-1)

[〜#〜] update [〜#〜]:-

ただし、@ Timのコメントによると、関数内でglobal変数を使用しないでください。 local scopeで使用するには、使用する前に変数を定義してください。一般に、変数のスコープをlimitlocal、さらにはlocal名前空間limitでもローカル変数のスコープにしようとする必要があります。コードが理解しやすくなります。

変数の範囲を拡大すればするほど、使用する必要のない外部ソースによって使用される可能性が高くなります。

9
Rohit Jain

関数内のどこかにvar = ...がある場合、名前 "var"は、その割り当てが発生する場所に関係なく、関数全体のローカル変数として扱われます。これは、関数内のvarのすべてのオカレンスがローカルスコープで解決されることを意味します。したがって、var = varの右側では、varがないため、割り当て前の参照エラーが発生します。関数のスコープでまだ初期化されています。

6
Andrew Clark

2番目のコードでは、RHSでローカル変数を作成し、それを定義せずに、グローバルであるLHS変数varに割り当てています(関数の外部で定義された変数は明示的にグローバルと見なされます)。

関数内にローカル変数を作成し、それをグローバル変数の値に割り当てることを意図している場合、これでうまくいきます。

var = 0

def func(num):
    print num
    func.var = var # func.var is referring the local
                   # variable var inside the function func
    if num != 0:
        func(num-1)

func(10)
0
TechnoTech

グローバルを宣言せずにグローバルを読み取ることができます。ただし、グローバルを作成するには、グローバルとして宣言する必要があります。

0
user1277476
def runscan(self):
    p = os.popen('LD_PRELOAD=/usr/libv4l/v4l1compat.so zbarcam
                /dev/video0','r')

def input(self):
    self.entryc.insert(END, code)

これはどう?次の関数にローカルの「コード」を使用して、バーコードの結果をTkinterentryBoxに挿入したい。ありがとう