2

私はpythonが初めてです。

を呼び出したときに新しいオブジェクトを取得できないのはなぜtempMyObject = myObject()ですか?

class myObject(object):
  x = []

def getMyObject():
  tempMyObject = myObject()
  print "debug: %s"%str(tempMyObject.x)
  tempMyObject.x.append("a")
  return tempMyObject
#run
a = getMyObject()
b = getMyObject()

私のデバッグは出力します:

debug: []
debug: ["a"]

これらのデバッグ配列の両方が null でない理由がわかりません。誰か教えてください。

編集:投稿のPythonコードに入力した間違いを見つけました。関数で .append("a") を使用しています

4

2 に答える 2

6

xインスタンス変数ではなく、クラス変数として作成しました。変数をクラスの特定のインスタンスに関連付けるには、次のようにします。

class myObject(object):
    def __init__(self): # The "constructor"
        self.x = [] # Assign x to this particular instance of myObject

>>> debug: []
>>> debug: []

何が起こっているのかをもう少し詳しく説明するには、同じことをもう少し明示的に (より詳細に) 示したこの小さなモックアップを見てください。

class A(object):
    class_var = [] # make a list attached to the A *class*
    def __init__(self):
        self.instance_var = [] # make a list attached to any *instance* of A

print 'class var:', A.class_var # prints []
# print 'instance var:', A.instance_var # This would raise an AttributeError!

print

a = A() # Make an instance of the A class
print 'class var:', a.class_var # prints []
print 'instance var:', a.instance_var # prints []

print

# Now let's modify both variables
a.class_var.append(1)
a.instance_var.append(1)
print 'appended 1 to each list'
print 'class var:', a.class_var # prints [1]
print 'instance var:', a.instance_var # prints [1]

print

# So far so good. Let's make a new object...
b = A()
print 'made new object'
print 'class var:', b.class_var # prints [1], because this is the list bound to the class itself
print 'instance var:', b.instance_var # prints [], because this is the new list bound to the new object, b

print

b.class_var.append(1)
b.instance_var.append(1)
print 'class var:', b.class_var # prints [1, 1]
print 'instance var:', b.instance_var # prints [1]
于 2013-07-11T20:15:25.787 に答える
1

何よりもまずクラス初期化子など、コードにいくつかのビットが欠けています。正しいコードは次のとおりです。

class myObject(object):
    def __init__(self):
         self.x=[] #Set x as an attribute of this object.

def getMyObject():
  tempMyObject = myObject()
  print "debug: %s"%str(tempMyObject.x) #Just after object initialisation this is an     empty list.
  tempMyObject.x = ["a"]
  print "debug2: %s"%str(tempMyObject.x) #Now we set a value to it.
  return tempMyObject
#run
a = getMyObject()
b = getMyObject()

これで、デバッグは最初に空のリストを出力し、それが設定されると "a" を出力します。お役に立てれば。基本的な python クラスのチュートリアルを見ることをお勧めします。

于 2013-07-11T20:22:34.733 に答える