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'}
我用一个字典变量创建了一个 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'}