289

グローバル変数がどのように機能するかについて少し混乱しています。約 50 個のファイルを含む大規模なプロジェクトがあり、それらすべてのファイルに対してグローバル変数を定義する必要があります。

私がしたことは、main.py次のようにプロジェクトファイルでそれらを定義することでした:

# ../myproject/main.py

# Define global myList
global myList
myList = []

# Imports
import subfile

# Do something
subfile.stuff()
print(myList[0])

次のようmyListに、で使用しようとしていますsubfile.py

# ../myproject/subfile.py

# Save "hey" into myList
def stuff():
    globals()["myList"].append("hey")

別の方法を試しましたが、うまくいきませんでした

# ../myproject/main.py

# Import globfile    
import globfile

# Save myList into globfile
globfile.myList = []

# Import subfile
import subfile

# Do something
subfile.stuff()
print(globfile.myList[0])

そして、subfile.py私はこれを持っていました:

# ../myproject/subfile.py

# Import globfile
import globfile

# Save "hey" into myList
def stuff():
    globfile.myList.append("hey")

しかし、やはりうまくいきませんでした。これをどのように実装すればよいですか?2つのファイルが本当にお互いを知らない場合(サブファイルがメインを知らない場合)、そのように機能しないことは理解していますが、io書き込みまたはピクルを使用せずにそれを行う方法を考えることができませんやりたくない。

4

9 に答える 9

420

問題は から定義myListしたことですmain.pyが、それsubfile.pyを使用する必要があります。この問題を解決するクリーンな方法は次のとおりです。すべてのグローバルをファイルに移動します。このファイルを file と呼びますsettings.py。このファイルは、グローバルの定義と初期化を担当します。

# settings.py

def init():
    global myList
    myList = []

次に、subfileグローバルをインポートできます。

# subfile.py

import settings

def stuff():
    settings.myList.append('hey')

subfileが呼び出されないことに注意してくださいinit()— そのタスクは に属しますmain.py:

# main.py

import settings
import subfile

settings.init()          # Call only once
subfile.stuff()         # Do stuff with global var
print settings.myList[0] # Check the result

このようにして、グローバル変数を複数回初期化することを避けながら、目的を達成します。

于 2012-10-23T16:16:48.337 に答える
23

Python のグローバル変数は「モジュール」変数と考えることができます。そのため、従来の C の「グローバル変数」よりもはるかに便利です。

グローバル変数は実際にはモジュール内で定義されており、__dict__そのモジュールの外部からモジュール属性としてアクセスできます。

したがって、あなたの例では:

# ../myproject/main.py

# Define global myList
# global myList  - there is no "global" declaration at module level. Just inside
# function and methods
myList = []

# Imports
import subfile

# Do something
subfile.stuff()
print(myList[0])

と:

# ../myproject/subfile.py

# Save "hey" into myList
def stuff():
     # You have to make the module main available for the 
     # code here.
     # Placing the import inside the function body will
     # usually avoid import cycles - 
     # unless you happen to call this function from 
     # either main or subfile's body (i.e. not from inside a function or method)
     import main
     main.mylist.append("hey")
于 2012-10-23T16:04:31.520 に答える
12

を使用from your_file import *すると、問題が解決するはずです。グローバルに使用できるようにすべてを定義します(もちろん、インポートのローカル変数を除く)。

例えば:

##test.py:

from pytest import *

print hello_world

と:

##pytest.py

hello_world="hello world!"
于 2012-10-23T15:59:49.400 に答える
10

Hai Vu の回答はうまく機能します。コメントは 1 つだけです。

他のモジュールでグローバルを使用していて、グローバルを動的に設定したい場合は、グローバル変数を設定した後に他のモジュールをインポートするように注意してください。次に例を示します。

# settings.py
def init(arg):
    global myList
    myList = []
    mylist.append(arg)


# subfile.py
import settings

def print():
    settings.myList[0]


# main.py
import settings
settings.init("1st")     # global init before used in other imported modules
                         # Or else they will be undefined

import subfile    
subfile.print()          # global usage
于 2015-12-23T09:23:58.137 に答える
4

2 回目の試行は完全に機能し、実際に、グローバルに使用できるようにしたい変数名を処理するための非常に優れた方法です。しかし、最後の行に名前エラーがあります。それがどうあるべきかは次のとおりです。

# ../myproject/main.py

# Import globfile    
import globfile

# Save myList into globfile
globfile.myList = []

# Import subfile
import subfile

# Do something
subfile.stuff()
print(globfile.myList[0])

最後の行を参照してください。myList は、サブファイルではなく、globfile の属性です。これはあなたが望むように動作します。

マイク

于 2012-10-23T16:08:42.443 に答える