Python 改变字典值

Python change dict value

我用一个字典变量创建了一个 class,以及一个编辑它的方法:

class Test:
   TestDict = {"TestKey": "OldValue"}

   def ChangeDictionary(self):
       self.TestDict["TestKey"] = "NewValue"

然后,我创建了两个对象:

ObjectOne = Test()
ObjectTwo = Test()

在 ChangeDictionary 方法调用之前和之后打印他们的词典:

# Print values before method call
print(ObjectOne.TestDict)
print(ObjectTwo.TestDict)

# Call method
ObjectTwo.ChangeDictionary()

# Print values after method call
print(ObjectOne.TestDict)
print(ObjectTwo.TestDict)

我得到这个输出:

{'TestKey': 'OldValue'}
{'TestKey': 'OldValue'}
    * * Method call * *
{'TestKey': 'NewValue'}
{'TestKey': 'NewValue'}

因此从第二个对象调用的方法 ChangeDictionary 也更改了第一个对象中的值。
是 Python 语言错误还是其他地方的原因?

更新: 如果 class 变量将是任何其他类型(例如 - 字符串) - 第一个对象变量将具有旧值:

class Test:
    TestString = "OldValue"

    def ChangeString(self):
        self.TestString = "OldValue"

如上定义answer:

  • init方法之外的元素是静态元素;他们属于 class.
  • init方法里面的元素是对象(self)的元素;他们不属于 class.

要解决这个问题,试试这个 -

class Test:
    def __init__(self):                          #<-------
        self.TestDict = {"TestKey": "OldValue"}  #<-------
    
    def ChangeDictionary(self):
        self.TestDict["TestKey"] = "NewValue"
        
        
ObjectOne = Test()
ObjectTwo = Test()

# Print values before method call
print(ObjectOne.TestDict)
print(ObjectTwo.TestDict)

# Call method
ObjectTwo.ChangeDictionary()
print("** Method call **")

# Print values after method call
print(ObjectOne.TestDict)
print(ObjectTwo.TestDict)
{'TestKey': 'OldValue'}
{'TestKey': 'OldValue'}
** Method call **
{'TestKey': 'OldValue'}
{'TestKey': 'NewValue'}

编辑:如@juanpa.arrivillaga 所述,您对 class 函数所做的修改定义了一个与您之前拥有的对象分开的不可变对象。

注意下面两种方法的不同 -

#### ORIGINAL STRING ####

class Test:
    TestString = "OldValue"

    def ChangeString(self):
        self.TestString = "NewValue"
        
        
ObjectOne = Test()
ObjectTwo = Test()

# Print values before method call
print(ObjectOne.TestString)
print(ObjectTwo.TestString)

# Call method
ObjectTwo.ChangeString()
print("** Method call **")

# Print values after method call
print(ObjectOne.TestString)
print(ObjectTwo.TestString)

print("** Self dicts **")
print(ObjectOne.__dict__)
print(ObjectTwo.__dict__)
OldValue
OldValue

** Method call **
OldValue
NewValue

** Self dicts **
{}
{'TestString': 'NewValue'}

__init__


### FIXED STRING ###

class Test:
    def __init__(self):
        self.TestString = 'OldValue'
    
    def ChangeString(self):
        self.TestString = "NewValue"
               
ObjectOne = Test()
ObjectTwo = Test()

# Print values before method call
print(ObjectOne.TestString)
print(ObjectTwo.TestString)

# Call method
ObjectTwo.ChangeString()
print("** Method call **")

# Print values after method call
print(ObjectOne.TestString)
print(ObjectTwo.TestString)

print("** Self dicts **")
print(ObjectOne.__dict__)
print(ObjectTwo.__dict__)
OldValue
OldValue
** Method call **
OldValue
NewValue
** Self dicts **
{'TestString': 'OldValue'}
{'TestString': 'NewValue'}